已经用.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> 比较急,谢谢,解决后立刻揭贴
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> 比较急,谢谢,解决后立刻揭贴
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("调用服务组件完成");
}
_Dialogs 是什么东西?
if(SUCCEEDED(cm.CreateInstance(IID_XXX)))
{
cm->SomeMethod()
}string应该映射成了BSTR, 使用_bstr_t就可以了
在生成的类声明中可以找到
DotNetObject:=CreateOleObject('eMESCOM.CardMapping');
DotNetObject.CardMap(id, resource, userCode, newId, IMEI, 0)) ;
我想通过 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();