??如何调用COM+对象?(100分)

  • 主题发起人 主题发起人 drmy
  • 开始时间 开始时间
D

drmy

Unregistered / Unconfirmed
GUEST, unregistred user!
我用C++Builder6做了一个COM+程序,安装到了COM+环境中。COM+中定义了几个函数,参数有in和in&out类型,我现在想做一个SOAP server程序调用这些函数,用了CreateOleObject等函数,也考虑到了函数参数等问题:
Variant vDODemo;
OleVariant sData;
CoInitialize(NULL);
// OleInitialize(NULL);
try
{
vDODemo = CreateOleObject("TDM1.TDM1");
vDODemo.OlePropertySet("SQL",sSQL);
vDODemo.OlePropertySet("Data",AnsiString(sData));
vDODemo.OleFunction("QueryHjData");
/// Function QueryHjData("QueryHjData");
/// QueryHjData << NamedParm("SQL",sSQL) << NamedParm("Data",AnsiString(sData));
/// vDODemo.Exec(QueryHjData);
// vDODemo.QueryHjData(sSQL, sData);
// return sData;
}
__finally
{
CoUninitialize();
//OleUninitialize();
}
编译通过,但是连接时报错,怎么回事?
 
什么错误?
 
不能解决的外部错误,函数和生成的obj文件之间有什么错误。
 
请问大家是怎么在C++Builder中调用COM+对象的?
 
你是否用“Import Type Library”导入COM+组件的?导入后C++ Builder会生成几个接口
文件存在Imports目录下,在你的项目单元中引用其中的.h文件就可以了。
 
Sachow,又是你老兄,真好。
其实是这样的:
我照着李维那本《Delphi6 WebService》书第11章做成了那个WebService调用COM+组件的例子
程序。我现在想把这个程序移植成C++Builder6版本的。在修改了C++Builder6作COM+组件的
那个Bug后做成了COM+组件,然后作WebService Server端程序,就是用上面的方法调用,
最后是做WebService Client端,很简单。但是执行老是报错。最后我把这个程序和Delphi6
版本的程序互相调用试验发现,C++Builder6版本的COM+组件和WebService Server端程序
都有错误,目前还没有找到解决方案。
所以您要是能帮我把这个程序移植成C++Builder6版本就好了。
 
另:我上面说的连接错误已经解决了,是因为我的一个马虎错误而已。现在的问题是编译
3个程序编译连接都成功,但是执行报错“未知错误”或者“远程过程调用错误”。
 
李维的《Delphi6 WebService》? 我没有这本书,我只有他的《Delphi5.x 电子商务篇》,
而且我在利用C++ Builder的向导建立Transaction Object或Transaction DataModule时都
不能成功地调用,显示:“连接到事务或没有事务.”,
但是当我建立了一个Automation对象,把它安装在COM+中,通过组件服务管理器给这个对象
设置事务支持的属性后,组件是能够调用的。
我一直不太明白的就是一个COM+程序在代码上与COM程序有没有区别?为什么用向导建立的
事务对象却总是不能被正常调用。也许正是由于这些疑问得不到解答,我才抛开COM+转去
学习CORBA的。
 
李维的那本新书是《Delphi 6 SOAP/ Web Service程序设计篇》,据说
《C++Builder 6 SOAP/ Web Service程序设计篇》也会出了。
由于我原来只用Delphi做过MTS对象,对C++Builder下的这些错误不是很清楚。只是发现
在C++Builder6中按照向导制作的Transaction DataModule,只要放入一个ADO控件就会连
编译都要报错。后来修改了C++Builder6的一个源代码就能通过了。这个问题我在CSDN看到
讨论过,说是C++Builder6的Bug,只是找不到帖子了。
 
你说的那个BUG是关于Transaction二义性的,我说的可不是这个错误,而是调用时的错误,
编译通得过,但调用总是失败。
 
是的,我现在正是碰到了调用时失败的错误,没有办法:(
 
我今天终于把通过Transaction DataModule向导建立的程序调试通过了,原来以前一直用错
了数据模块中的对象,导致访问了无效的地址,组件程序一运行就出错终止,现在终于好了!
我已经把程序发到你的邮箱了。
 
太谢谢了!!!
我先仔细看看程序,然后一定发分。
 
Sachow,最近繁忙没有来得及研究程序,只是那个程序我没有调通。
错误发生在客户端调用时会报错“Create(intfObj)服务器运行失败”,我按照你说的
import了服务端,但是也不行。
另外服务器端定义的那个函数的两个参数类型是Out和RetVal,请问为什么这样定义,
他们是什么意思?
 
服务器端是否已经安装到COM+当中? 客户端调用时出错的问题我也遇到过,主要原因是数据库
方面出错。
我的那个方法只有一个参数,定义为Out + RetVal类型,RetVal表示它是函数的返回值,Out
表示它可以被写,所以可以用以下两种调用方法:
WideString S;
TCOMIDMServer Obj1;
Obj1 = CoDMServer::Create();
Obj1->GetMyData(&amp;S);
//方法1:以out参数写入
//S = Obj1->GetMyData();
//方法:以返回值方式取得
ShowMessage(S);
 
好吧,我再自己试试吧。不耽误您的分数了。
我们现在应该是确定用WebService调用CORBA对象这套方案了。谢谢你上次的程序指点!!
 
我已经发现了给你的那个例程中的错误了,我在程序中设了访问CB6自带的Access数据库
(BCDEMOS.mdb),但不能连接那个数据库,所以才出现那个错,我换成连接一个SQL Server
数据库就好了。不知BCDEMOS.mdb是怎么搞的!
另外,你们的项目中Web Service用的是哪种技术?CGI、ISAPI、ASP?
 
谢谢Sachow!
由于我最近在海南出差,很难上网所以没能及时回复,请见谅。
在您的提示之下,我已经成功的分别用Delphi6和C++Builder6调成功了
WebService Client调用ISAPI的WebService Server,再调用CORBA对象。
非常感谢,如果需要,我们可以继续交流,共同进步。
 
后退
顶部