如题多谢各位。在线等。

解决方案 »

  1.   

    在dll的unit里,
    Initialization里初始化,
    Finalization里释放不行吗?
      

  2.   

    Win32的DLL里,没有全局对象,因为不同模块调用同一DLL,都是映射一份新的到内存。
      

  3.   

    library xxxx;
    uses
      ...;
    procedure DllMain(Reason: Integer);
    begin
      case Reason of
        DLL_PROCESS_ATTACH: begin
          //这里初始化
        end;    DLL_PROCESS_DETACH: begin
          //这里销毁
        end;
      end;
    end;
    begin
      DLLProc := @DllMain;
    end.
      

  4.   

    由delphi的rtl中dll入口机制决定,如果光在主程序中指定入口点函数,而不在主程序中调用入口点函数并传入DLL_PROCESS_ATTACH的话,DLL_PROCESS_ATTACH的情况是不会被执行到的
      

  5.   

    对,我就只是希望是在单独的进程中能够做到全局共享。
    在dll的unit里, 
    Initialization里初始化, 
    Finalization里释放 这种方法,是怎么书写的?我写了好多种连编译都通不过,特别是dll的文件最后还有begin   end的,那么要放到哪里?
      

  6.   

    建议将全局对象的指针传到DLL中,这样DLL就可以操纵全局的对象了
      

  7.   

    在 DLL 中操作全局对象有点危险:你不能保证所有模块都以同样方式访问此对象。最好在 DLL 内部操作对象,同时提供标准接口函数供外部访问。
      

  8.   

    不明白表达的是什么意思.DLL是先执行入口代码,即library单元的begin ... end.域,然后是执行
    SysInit单元的InitLib,DLL_PROCESS_ATTACH等的参数值,实际上是由系统在调用DLL的入口函数时传入的,而并不是程序当中做的,任何一个进程在加载/卸载,任何一个线程调用都会由系统来保证其被调用.procedure _InitLib;
    asm
            { ->    EAX Inittable   }
            {       [EBP+8] Hinst   }
            {       [EBP+12] Reason }
            {       [EBP+16] Resvd  }        MOV     EDX,offset Module
            CMP     dword ptr [EBP+12],DLL_PROCESS_ATTACH
            JNE     @@notInit        PUSH    EAX
            PUSH    EDX
            MOV     ModuleIsLib,1
            MOV     ECX,[EBP+8]
            MOV     HInstance,ECX
            MOV     [EDX].TLibModule.Instance,ECX
            MOV     [EDX].TLibModule.CodeInstance,0
            MOV     [EDX].TLibModule.DataInstance,0
            CALL    InitializeModule
            POP     EDX
            POP     EAX@@notInit:
            PUSH    DllProc
            MOV     ECX,offset TlsProc
            CALL    _StartLib
    end;
      

  9.   

    DllProc是声明在SysInit单元当中的一个全局变量.
      

  10.   

    随便在你的DLL_PROCESS_ATTACH的case中写点儿什么看能不能执行到就知道了
    rtl对dll的初始化就是用dll入口点传入的DLL_PROCESS_ATTACH判断的,dll中begin/end段中的内容就是在DLL_PROCESS_ATTACH时发生的
      

  11.   

    是这样的。我先需要写一个delphi的dll,供vc进行调用。但是我希望我自己能够在dll中自己控制自己的全局变量对象的创建和销毁(当然只需要在一个进程中共享),这样能够做到吗?
      

  12.   


    function CreateObject :Longint; stdcall;
    begin
      Result := LongInt(Pointer(TXX.Create())); 
    end;procedure FreeObject(Obj :Longint); stdcall;
    begin
      TXX(Pointer(Obj)).Free;
    end;exports
      CreateObject,
      FreeObject;beginend;
      

  13.   


    应该 改成 library xxxx;
    uses
      ...;
    procedure DllMain(Reason: Integer);
    begin
      case Reason of
        DLL_PROCESS_ATTACH: begin
          //这里初始化
        end;    DLL_PROCESS_DETACH: begin
          //这里销毁
        end;
      end;
    end;
    begin
      DLLProc := @DllMain;
      DllEntryPoint(DLL_PROCESS_ATTACH);//这句要加上的吧
    end.
      

  14.   

    我建议不用Delphi学Dll,建议用vc++写,我们公司专门就有个用vc++学Dll的。