排除Delphi5中编写COM+程序的一个错误

原创 2001年11月25日 19:12:00

          在Delphi5中编写COM+组件时总获得不到ObjectContext
也就是调用GetObjectContext返回nil. 这使事物处理没法正确
完成. 有人在网上告诉我在COM+组件前加上一条加载mtxex.dll
语句.确实解决了这个问题, 但好像运行的并不稳定.
procedure TgEntityObj.Initialize;
begin
  inherited;
  LoadLibrary('mtxex.dll');
end;
但我在Delphi6中不加这条语句就可以获得ObjectContext.
我看了D6中的MTX单元和D5果然不一样, 这也不能怪Borland
D5出来的时候WIN2000(COM+)还没出来所以D5中MTX单位中还是加载
MTS的写法.

在D5 MTX单元中253行.
implementation

uses ComObj;

type
  TGetObjectContextProc = function(var ObjectContext: IObjectContext): HRESULT; cdecl;
  TSafeRefProc = function(const rid: TGUID; Unk: IUnknown): Pointer; cdecl;
var
  GetObjectContextProc: TGetObjectContextProc = nil;
  SafeRefProc: TSafeRefProc = nil;
  MtsProcsLoaded: Boolean = False;

procedure LoadMtsProcs;
var
  Mtxdll: HModule;
begin
  if MtsProcsLoaded then Exit;
  MtsProcsLoaded := True;
  Mtxdll := GetModuleHandle('mtxex.dll');
  if mtxdll <> 0 then
  begin
    @GetObjectContextProc := GetProcAddress(Mtxdll, 'GetObjectContext');
    @SafeRefProc := GetProcAddress(Mtxdll, 'SafeRef');
  end;
end;

function GetObjectContext: IObjectContext;
begin
  LoadMtsProcs;
  if Assigned(GetObjectContextProc) then
    OleCheck(GetObjectContextProc(Result))
  else
    Result := nil;    //单步执行时返回空.
end;

D6中的MTX单元 注意不同.

implementation

uses ComObj;

type
  TGetObjectContextProc = function(var ObjectContext: IObjectContext): HRESULT; cdecl;
  ///
  TCoGetObjectContextProc = function(const riid: TGUID; var ObjectContext: IObjectContext): HRESULT; stdcall;
  TSafeRefProc = function(const rid: TGUID; Unk: IUnknown): Pointer; cdecl;
var
  GetObjectContextProc: TGetObjectContextProc = nil;
  CoGetObjectContextProc: TCoGetObjectContextProc = nil;    ///
  SafeRefProc: TSafeRefProc = nil;
  MtsProcsLoaded: Boolean = False;

function IsComPlusPlatform: boolean;      //////  是否为COM+
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;

加斜细的是多的部分你只需要把这些部加D5的MTX就可以了.然后另存到你程序的当前目录
编译程序就能获得ObjectContext了.

练习1-24 编写一个程序,查找C语言程序中的基本语法错误,如圆括号、方括号、花括号不配对等

程序: #include int checkbrackets(int c); main() { int c,checkstate; while((c=getchar())!=EO...
  • Civil_CHOW
  • Civil_CHOW
  • 2016年06月03日 20:06
  • 1651

com 与com+加是有什么区别

COM的产生         在以前程序设计过程中,程序员把它们的函数库放在一个叫做目标(Object)文件的单独文件中,在这些文件中,包含了编译过的代码。当程序员要使用一个特别的目标文件的时...
  • guomei
  • guomei
  • 2007年06月23日 17:13
  • 617

win7组件服务COM+应用程序编录错误解决办法

win7组件服务COM+应用程序编录错误解决办法   一般情况下,我们遇到过的COM+应用程序编录错误共有两个:(1)第一个是打开COM+应用程序时出现“编录错误,执行最后操作发生错误,...
  • mfkpie
  • mfkpie
  • 2015年03月04日 22:21
  • 1418

delphi5安装教程

1.如果直接安装Delphi5通常会出现以下错误 2.最佳解决办法是虚拟光驱安装法:工具ISO制作工具,虚拟光驱软件(推荐DTLite) 3.步骤:用虚拟光驱载入Delphi5的光盘映像文...
  • u010219209
  • u010219209
  • 2015年04月04日 10:11
  • 1130

编写一个程序,程序中要调用名为one_three ();函数,······

P31 调用函数中的函数
  • zhuyaowei10703
  • zhuyaowei10703
  • 2014年08月02日 23:02
  • 1019

[熊猫烧香]核心源码(Delphi模仿版本)

program Japussy;uses  Windows, SysUtils, Classes, Graphics, ShellAPI{, Registry};const  HeaderSize =...
  • shirley329
  • shirley329
  • 2007年02月21日 03:57
  • 464

C语言程序的错误避免

这里我将陆续给大家载出我在以前学习和编写c代码时遇到的问题和解决方法、学习的心得,有些是经过查询一些曾经参加微软microsoft的开发小组的老程序员的书籍和资料后提供给大家! 首先,当发现错误...
  • yumengkk
  • yumengkk
  • 2011年09月20日 00:16
  • 2187

SQL server 安装时“无法在COM+目录中安装和配置程序”的解决办法

SQL server 安装时“无法在COM+目录中安装和配置程序”的解决办法2008-07-09 13:19:51|  分类: 服务器技术 阅读126 评论0  字号:大中小 订阅安装到最后一步时提示...
  • leamonjxl
  • leamonjxl
  • 2011年06月21日 17:32
  • 1817

练习1-14 编写一个程序,打印输入中各个字符出现频度的直方图

#include #define MAXHIST 15 #define MAXCHAR 128 main() { int c,i; int len; int maxvalue...
  • Civil_CHOW
  • Civil_CHOW
  • 2016年05月30日 21:15
  • 937

编写一个程序,查找C语言中的基本语法错误,如圆括号、方括号、花括号不配对等,正确处理引号与注释

#include int brace, brack, paren; void in_quote(int c); void in_comment(void); void search(i...
  • u012323667
  • u012323667
  • 2016年08月31日 19:13
  • 867
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排除Delphi5中编写COM+程序的一个错误
举报原因:
原因补充:

(最多只允许输入30个字)