得到ObjectContext的方法在winnt 4和windows 2000中不同,对于delphi6没什么问题,delphi 5就不行了。或者你自己改写Mtx.pas里的LoadMtsProcs方法。

解决方案 »

  1.   

    改了,没用。
    是在执行mtxex.dll 中的GetObjectContent过程时出错的!btw, LoadLibrary 和 GetModuleHandle 除了在计数器上有区别外,还有没有其他的区别,为什么有时候用GetModuleHandle可以,有时候又必须用LoadLibrary?
      

  2.   

    打ADO和DELPHI 的 补丁了没有???
      

  3.   

    Congratulation!!!!!!搞定了,原来在Win2000下面的确不一样,需要针对COM+做不同的处理。多谢Chiro的提示,不如让这个贴子在呆一天,让大家也分享一下如何,分不会少拉!!!!想听听大家对COM以及MTS的看法?
      

  4.   

    Delphi5在Win2000下创建基于Com+的组建需要对Delphi源代码进行如下修改: 
    在Mtx单元,添加:TCoGetObjectContextProc = function(const riid: TGUID; var ObjectContext: IObjectContext): HRESULT; stdcall;  CoGetObjectContextProc: TCoGetObjectContextProc = nil;然后将以下过程更改为: //其实就是吧Delphi6下面相关的过程移植到Delphi5下即可
    function IsComPlusPlatform: boolean;
    var
      Ver: TOsVersionInfo;
    begin
      Ver.dwOSVersionInfoSize := sizeof(Ver);
      GetVersionEx(Ver);
      if (Ver.dwPlatformID = VER_PLATFORM_WIN32_NT) and 
         (Ver.dwMajorVersion >= 5) then
           Result := true
      else Result := false;
    end;
      
    procedure LoadMtsProcs;
    var
      Mtxdll: HModule;
    begin
      if MtsProcsLoaded then Exit;
      MtsProcsLoaded := True;
      if IsComPlusPlatform then
      begin
        Mtxdll := GetModuleHandle('ole32.dll');
        if mtxdll <> 0 then
           @CoGetObjectContextProc := GetProcAddress(Mtxdll, 'CoGetObjectContext');
      end
      else 
      begin
        Mtxdll := GetModuleHandle('mtxex.dll');
        if mtxdll <> 0 then
        begin
          @GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
          @SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
        end;
      end;
    end;function GetObjectContext: IObjectContext;
    const
      IID_IObjectContext: TGUID = '{51372AE0-CAE7-11CF-BE81-00AA00A2FA25}';
    begin
      LoadMtsProcs;
      if Assigned(CoGetObjectContextProc) then
        CoGetObjectContextProc(IID_IObjectContext, Result)
      else if Assigned(GetObjectContextProc) then
        OleCheck(GetObjectContextProc(Result))
      else
        Result := nil;
    end;