现有一个别人写好的组件,只有一个dll文件,名称为UT.dll,目录为d:\UTSms\UT.dll,并已注册.
当在vc调用该组件时用#import "d:\UTSms\UT.dll" using namespace UTLib;
我想知道在vc调用组件时必须指定dll文件的路径马?(组件不放在系统目录或程序当前目录)
有没有其他办法加载组件?

解决方案 »

  1.   

    CoInitialize
    CoCreateInstance
    QueryInterface
    AddRef
    Release
    CoUninitialize
      

  2.   

    调用时只需要引用头文件,一般是组件名.h和组件名_i.c两个文件,至于dll不需要引入
      

  3.   

    #import "d:\UTSms\UT.dll" using namespace UTLib; //导入COM类型库而已
    COM注册后能通过CLSID在注册表中找到他的地址,#import只是导入他的类型库,生成一个包装类而已。
      

  4.   

    #import "d:\UTSms\UT.dll" using namespace UTLib;产生两个文件UT.tli,UT.tlh为类型库.在debug目录下,只用于编写程序.
      

  5.   

    我想知道在vc调用组件时必须指定dll文件的路径马?(组件不放在系统目录或程序当前目录)
    有没有其他办法加载组件?对于COM不是必须指定dll文件的路径的,你只要知道对应你要使用对象的CLSID就可以了使用
    这是一个UUID或GUID 当COM对象注册时就在注册表中对就了COM对象的的.dll路径
    CoCreateInstance建立对象返回接口或使用CoGetClassObject返回IClassFactory接口调用接口的CreateInstace建立
      

  6.   

    其他方法加载组件有:
    从Wizard->Add Class->From Type Library,选择组件。
    或Project->Add to Project->Components and controls.
      

  7.   

    只要把COM组件在客户机上面注册即可以使用,不需要知道组件的具体位置(已经写入注册表!)
    CoCreateInstance或者CoGetClassObject 和CreateInstance就可以根据CLSID来在注册表里面找到相应的组件的路径来调用。
    那组件在客户机上面可以这样注册:
    1.对于服务进程外组件(*.exe),的注册为:*.exe/regserver
    注销为*.exe/unregserver
    2.对于进程内组件(*.dll)的注册:regsvr32 *.dll
    注销为:regsvr32 /u *.dll
    由于手边没有VC,如果参数有误,请谅,最好自己试试!
      

  8.   

    还有一种方式:
    GUID CLSID_MySvr;hResult=CoInitialize(NULL);
    if(FAILED(hResult))
    {
    MessageBox("Could not Initialize COM.","MessageBox",MB_OK);
    return ;
    }
    hResult=::CLSIDFromProgID(L"Mysvr.ServerObj",&CLSID_MySvr);
    if(hResult!=S_OK)
    {
    MessageBox("Could not Initialize COM.","Error Message",MB_OK);
    return ;
    }
    hResult=CoCreateInstance(CLSID_MySvr,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(void **)&pIUnknown);
    if(FAILED(hResult))
    {
    MessageBox("Could not Create a new RS232Srv Object.","Error Message",MB_OK);
    return ;

    hResult=pIUnknown->QueryInterface(IID_IBaseIO,(void **) &m_IBaseIO);
    if(FAILED(hResult))
    {
    MessageBox("Could not Create IBaseIO.","Error Message",MB_OK);
    return;
    }
    hResult=m_IBaseIO->BiuldNewDataioObject(&m_bstrSvrName);