我象写一段Dll的代码,实现在其被载入时调用CoInitialion(nil),被卸出时调用
CoUnInitialion。大家能给我个思路或代码吗?(那个重定向DllProc的办法太恶心,我就不想说了。)
另外,在Dll中能使用ADO系列的组件吗?

解决方案 »

  1.   

    在Dll中能使用ADO系列的组件!
      

  2.   

    在Unit的Initalization与FInitalization中定义
      

  3.   

    在Dll中能使用ADO系列的组件!
    可以在
    dll的
    begin
      写CoInitialion(nil)
    end
    在不用ADO控件后
    CoUnInitialion。
      

  4.   

    可以啊, 我就是在DLL 中用ADO组件
    uses activex;
    procedure dllentrypoint(dreason : dword);
    begin
      case dreason of
        0 : CoUnInitialion
        1 : CoInitialion(nil)
       end;
    end;
    begin
      Dllproc := @dllentrypoint;
      dllentrypoint(1);
    end;
      

  5.   

    在调用Dll前加上这些语句﹕
    Try
    CoInitialion(nil);
        ……   //Called Dll function
    Finally
      CoUnInitialion;
    End;
    在Dll中能使用ADO系列的组件吗?
    答﹕可以
      

  6.   

    可是我的程序不能使用DLL,莫名其妙的出错。而且sz1008(dot) 老兄说的办法能给个详细代码吗?粘贴在这里就行了。
      

  7.   

    实现在其被载入时调用CoInitialion(nil),被卸出时调用CoUnInitialion。写在构造函数和析构函数里面不行么?
      

  8.   

    应该是在 DllEntryPoint 中实现的
    看我在 BCB 中使用的代码:
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
        switch(reason)
        {
        case DLL_PROCESS_ATTACH:        //初始化 COM
            CoInitialize(NULL);
            break;
        case DLL_PROCESS_DETACH:        //释放 COM
            CoUninitialize();
            break;    case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        }
        return 1;
    }
      

  9.   

    调用CoInitialion(nil)和CoUnInitialion就是为了在Dll中能使用ADO系列的组件
    否则这两句没有用(除非你还调用COM)
      

  10.   

    然後, 呼叫与使用就与一般的Delphi 没有两样5. 上述是直接写到呼叫DLL函式的程式单元中, 此外,也可以将DLL的呼叫宣告集中到一个程式单元(Import unit), Delphi 内附的 WinTypes, WinProcs是一个例子,您可以参考一下,同时观察一下 C 与 Pascal 互相对应的资料型态6. 除了上述的 static import 的方式, 另外有一种 dynamic import 的写法,先宣告一个程序类型(procedural-type),程式执行时, 以LoadLibrary() API Load进来後, 再以 GetProcAddress() API 取得函式的位址的方式来连结呼叫, 在ObjectPascal Language Guide P.132-133 有一个例子, 您可以参考看看,如果要举个例子, 以下是从我以前的程式节录出来的片断:(* for CWindows 3.1 *)
    unit Ime31;
    interface
    uses
    SysUtils, WinTypes, WinProcs, Dialogs;
    type
    (* 必要的资料型态宣告 *)
    tDateNTime = record
    wYear, wMonth, wDay: word;
    wHour, wMin, wSec: word;
    end;
    TImePro = record
    hWndIme: HWnd; { IME handle }
    dtInstDate: tDateNTime; { Date and time of installation }
    wVersion: word; { the version of IME }
    szDescription: array[0..49] of byte; { Description of IME module}
    szName: array[0..79] of byte; { Module name of the IME }
    szOptions: array[0..29] of byte; { options of IME at startup}
    fEnable: boolean; { IME status; True=activated,False=deactivated }
    end;
    pTImePro = ^TImePro;
    function SetIme(const sImeFileName: string): boolean; far;
    implementation
    (* begin 呼叫 winnls.dll export 函数的宣告 *)
    function ImpSetIme(hWndIme: HWND; lpImePro: pTImePro): boolean;far; external ’winnls.dll’;
    (* end 呼叫 winnls.dll export 函数的宣告 *)
    (* -------------------------------------------------- *)
    (* SetIme(const sImeFileName: string): boolean;
    (* ======
    (* 切换到某一特定的输入法
    (*
    (* 传入引数:
    (* sImeFileName: 输入法 IME 档名, 例: phon.ime;
    (* 空字串: 英数输入法
    (*
    (* 传回值:
    (* True: 切换成功
    (* False: 失败
    (* -------------------------------------------------- *)
    function SetIme(const sImeFileName: string): boolean;
    var
    pImePro: pTImePro;
    begin
    Result := False;
    if MaxAvail < SizeOf(TImePro) then
    begin
    MessageDlg(’记忆体不足’, mtWarning, [mbOk], 0);
    Exit;
    end
    else
    begin
    New(pImePro);
    try
    if sImeFileName = ’’ then (* 空字串, 还原到英数输入法 *)
    pImePro^.szName[0] := 0
    else
    StrPCopy(@pImePro^.szName, sImeFileName);
    Result := ImpSetIme(0, pImePro); (* 呼叫 ImpSetIme *)
    finally
    Dispose(pImePro);
    end; { of try }
    end;
    end; { of SetIme }
    end. 
      

  11.   

    使用EntryPoint的方法比较好凡是ActiveX的调用都要那句代码的了ADO是可以使用的!