现有一个别人写好的组件,只有一个dll文件,名称为UT.dll,目录为d:\UTSms\UT.dll,并已注册.
当在vc调用该组件时用#import "d:\UTSms\UT.dll" using namespace UTLib;
我想知道在vc调用组件时必须指定dll文件的路径马?(组件不放在系统目录或程序当前目录)
有没有其他办法加载组件?
当在vc调用该组件时用#import "d:\UTSms\UT.dll" using namespace UTLib;
我想知道在vc调用组件时必须指定dll文件的路径马?(组件不放在系统目录或程序当前目录)
有没有其他办法加载组件?
解决方案 »
- 如何创建一个与多个文档关联的MDI子窗体
- 如何获取带LVS_OWNERDATA样式的ListView里的数据
- 【结贴率100%】急!菜鸟求救!
- ADO连接数据库错误????????
- 用MSDEV批处理编译后,以后每次用VC6编译都会弹出一个命令提示符窗口(模拟DOS窗口的那个窗口)的问题
- 刚刚在CSDN上发布了开放源代码的聊天软件myicq,希望能与大家分享劳动成果。
- 关于recvfrom
- 系统怎样备份
- 响应回车键的是那一个消息.在View类里还是在MainFrame里.
- internat上的机器如何通过sock5代理来向局域网内的机器发信息
- 程序访问别的机器上的数据库出错!!
- 这是什么错误啊?
CoCreateInstance
QueryInterface
AddRef
Release
CoUninitialize
COM注册后能通过CLSID在注册表中找到他的地址,#import只是导入他的类型库,生成一个包装类而已。
有没有其他办法加载组件?对于COM不是必须指定dll文件的路径的,你只要知道对应你要使用对象的CLSID就可以了使用
这是一个UUID或GUID 当COM对象注册时就在注册表中对就了COM对象的的.dll路径
CoCreateInstance建立对象返回接口或使用CoGetClassObject返回IClassFactory接口调用接口的CreateInstace建立
从Wizard->Add Class->From Type Library,选择组件。
或Project->Add to Project->Components and controls.
CoCreateInstance或者CoGetClassObject 和CreateInstance就可以根据CLSID来在注册表里面找到相应的组件的路径来调用。
那组件在客户机上面可以这样注册:
1.对于服务进程外组件(*.exe),的注册为:*.exe/regserver
注销为*.exe/unregserver
2.对于进程内组件(*.dll)的注册:regsvr32 *.dll
注销为:regsvr32 /u *.dll
由于手边没有VC,如果参数有误,请谅,最好自己试试!
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);