VC6如何调用COM接口?

cxx1997 2005-09-21 10:15:13
已经用.Net写了一个COM,用VB、DELPHI都可以了,但是客户又需要VC版的,本人不会VC,通过看了网上的例子和自己尝试,总是问题不断,所以请教各位给一个例子。
DLL名称:eMESCOM.DLL,类:CardMapping,有两个方法:
public string CheckRoute(string id,string resrouce,string userCode,int language)
public string CardMap(string id,string resource,string userCode, string newId, string IMEI, int language)

Delphi调用的例子为:
/// Delphi 示例
///<code>
///
/// Declare a OleVariant variable:
///
/// public
/// { Public declarations }
/// DotNetObject:OleVariant;
/// end;
///
/// Load the object on the Forms OnCreate event:
///
/// procedure TForm1.FormCreate(Sender: TObject);
/// begin
/// DotNetObject:=CreateOleObject('eMESCOM.CardMapping');
/// end;
///
/// Execute the methods is as straight forward as this:
///
/// procedure TForm1.Button1Click(Sender: TObject);
/// begin
/// LabeledEdit1.Text:= DotNetObject.CardMap(id, resource, userCode, newId, IMEI, 0))
/// end;
///
///</code>

比较急,谢谢,解决后立刻揭贴
...全文
527 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxx1997 2005-09-21
  • 打赏
  • 举报
回复
我改用#import "eMESCOM.tlb" named_guids后,已经可以创建COM对象了,但是发现TLB文件中缺少对方法的定义描述,t->CheckRoute(); 不能编译通过。
我想通过 Invoke方式来调用,请问对于public string CheckRoute(string id,string resrouce,string userCode,int language)要怎么写?谢谢

printf("Hello World!\n");
HRESULT hresult;
CLSID clsid;
CoInitialize(NULL);
hresult=CLSIDFromProgID(OLESTR("eMESCOM.CardMapping"), &clsid);
eMESCOM::_CardMapping *t;
hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(eMESCOM::_CardMapping),(LPVOID *) &t);
if(FAILED(hresult))
{
printf("lost");
return;
}
// t->Invoke(); 这里要怎么写?
t->Release();
CoUninitialize();
碼上道 2005-09-21
  • 打赏
  • 举报
回复
加载
copygirl 2005-09-21
  • 打赏
  • 举报
回复
JFJFJF
copygirl 2005-09-21
  • 打赏
  • 举报
回复
JFJF
copygirl 2005-09-21
  • 打赏
  • 举报
回复
JF
cxx1997 2005-09-21
  • 打赏
  • 举报
回复
E:\VC2Net\VC2Net.cpp(5) : fatal error C1083: Cannot open type library file: 'eMESCOM.DLL': 加载类型库/DLL 时出错

用了#import "eMESCOM.DLL" named_guids

难道就不能象DELPHI那样直接

DotNetObject:OleVariant;
DotNetObject:=CreateOleObject('eMESCOM.CardMapping');
DotNetObject.CardMap(id, resource, userCode, newId, IMEI, 0)) ;

phoenix96_2000 2005-09-21
  • 打赏
  • 举报
回复
#import "eMESCOM.DLL" named_guids

编译器会生成CardMapping的smart pointer包装类,以及把组件类的GUID定义成IID_XXX 形式在生成的.tlb文件中可以找到

比如ICardMappingPtr

ICardMappingPtr cm;
if(SUCCEEDED(cm.CreateInstance(IID_XXX)))
{
cm->SomeMethod()
}

string应该映射成了BSTR, 使用_bstr_t就可以了
在生成的类声明中可以找到
快乐鹦鹉 2005-09-21
  • 打赏
  • 举报
回复
http://www.cndiy8.com/ask30/how210618.htm
cxx1997 2005-09-21
  • 打赏
  • 举报
回复
HRESULT 要引用哪个头文件?
_Dialogs 是什么东西?
cxx1997 2005-09-21
  • 打赏
  • 举报
回复
谢谢,难道不要加引用吗?比如#import之类的?

最好能给个现成的,我自己调都调的累死了
快乐鹦鹉 2005-09-21
  • 打赏
  • 举报
回复
例子:
void CTest2Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
HRESULT hresult;
CLSID clsid;

CoInitialize(NULL);

//初始化COM接口

hresult=CLSIDFromProgID(OLESTR("test.dialogs"), &clsid);

//得到组件的CLSID

_Dialogs *t;

//这就是我们在PRJADO.DLL中定义的类

hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(_Dialogs),(LPVOID *) &t);

//初始化CLSADO,CoCreateInstance()的第一个参数是对象的CLSID(类代码),这个128位的编码唯一地标识了组件服务,它的路径和运行参数等信息都放在系统注册表中;第二个参数一般情况下设为NULL;第三个参数用来指明对象的运行环境,如远程或本地,此处设为CLSCTX_INPROC_SERVER,标明是服务组件是一个DLL;第四个参数指明用来与对象通信接口的ID,这也是一个128位的编码;第五个参数是用来接收对象的接口指针。

if(FAILED(hresult))
{
AfxMessageBox("初始化服务组件失败");
return;
}

//如果初始化失败,弹出提示对话框后退出程序
CString str;

(_bstr_t)str=t->ShowDialog((_bstr_t)("abc"),true);
AfxMessageBox((CString)str);
//调用初始化函数

// t->ado_add("从VC调用组件") ;

//调用增加记录函数

//t->ado_UnInit ();

//调用关闭连接函数

t->Release();

//释放接口指针

CoUninitialize();

// 关闭COM库的联接

AfxMessageBox("调用服务组件完成");


}
cxx1997 2005-09-21
  • 打赏
  • 举报
回复
呵呵,问题解决

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧