已经用.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>  比较急,谢谢,解决后立刻揭贴

解决方案 »

  1.   

    例子:
    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("调用服务组件完成");
    }
      

  2.   

    谢谢,难道不要加引用吗?比如#import之类的?最好能给个现成的,我自己调都调的累死了
      

  3.   

    HRESULT  要引用哪个头文件?
    _Dialogs  是什么东西?
      

  4.   

    http://www.cndiy8.com/ask30/how210618.htm
      

  5.   

    #import "eMESCOM.DLL" named_guids编译器会生成CardMapping的smart pointer包装类,以及把组件类的GUID定义成IID_XXX 形式在生成的.tlb文件中可以找到比如ICardMappingPtrICardMappingPtr cm;
    if(SUCCEEDED(cm.CreateInstance(IID_XXX)))
    {
     cm->SomeMethod()
    }string应该映射成了BSTR, 使用_bstr_t就可以了
    在生成的类声明中可以找到
      

  6.   

    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)) ;
      

  7.   

    我改用#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();