描述:
VB代码:
Set APIRoot = CreateObject("APIRootObj.APIRootObj")
APIRoot.ServerIP="127.0.0.1"
APIRoot.ServerPort="8006"
请问在VC中如何使用?
解决方案1:
吓死你:
void Test();
int main()
{
::CoInitialize( NULL ); // COM 初始化
Test();
::CoUninitialize(); // 释放 COM
return 0;
}
void Test()
{
wchar_t szProgID[] = L"APIRootObj.APIRootObj";
BSTR szServerIP; //= L"127.0.0.1";
BSTR szServerPort; //= L"8006";
wchar_t szOpServerIP[] = L"ServerIP";
wchar_t szOpServerPort[] = L"ServerPort";
szServerIP = SysAllocString (L"127.0.0.1");
szServerPort = SysAllocString (L"8006");
CLSID clsid; // 通过 ProgID 得到 CLSID
HRESULT hr = ::CLSIDFromProgID( szProgID, &clsid );
assert( SUCCEEDED( hr ) ); // 如果失败,说明没有注册组件
IDispatch * pDisp = NULL; // 由 CLSID 启动组件,并得到 IDispatch 指针
hr = ::CoCreateInstance( clsid, NULL, CLSCTX_ALL, IID_IDispatch, (LPVOID *)&pDisp );
assert( SUCCEEDED( hr ) ); // 如果失败,说明没有初始化 COM
//设置属性 1
LPOLESTR pwFunName = szOpServerIP; // 准备取得 Add 函数的序号 DispID
DISPID dispID; // 取得的序号,准备保存到这里
hr = pDisp->GetIDsOfNames( // 根据函数名,取得序号的函数
IID_NULL,
&pwFunName, // 函数名称的数组
1, // 函数名称数组中的元素个数
LOCALE_SYSTEM_DEFAULT, // 使用系统默认的语言环境
&dispID ); // 返回值
assert( SUCCEEDED( hr ) ); // 如果失败,说明组件根本就没有 ADD 函数
//构造参数
/*
VARIANTARG v[2]; // 调用 Add(1,2) 函数所需要的参数
v[0].vt = VT_I4; v[0].lVal = 2; // 第二个参数,整数2
v[1].vt = VT_I4; v[1].lVal = 1; // 第一个参数,整数1
*/
VARIANTARG v[1];
v[0].vt = VT_BSTR;
v[0].bstrVal = szServerIP;
DISPPARAMS dispParams = { v, NULL, 1, 0 }; // 把参数包装在这个结构中
VARIANT vResult; // 函数返回的计算结果
hr = pDisp->Invoke( // 调用函数
dispID, // 函数由 dispID 指定
IID_NULL,
LOCALE_SYSTEM_DEFAULT, // 使用系统默认的语言环境
DISPATCH_PROPERTYPUT, // 调用的是属性
&dispParams, // 参数
&vResult, // 返回值
NULL, // 不考虑异常处理
NULL); // 不考虑错误处理
assert( SUCCEEDED( hr ) ); // 如果失败,说明参数传递错误
/*
CString str; // 显示一下结果
str.Format("1 + 2 = %d", vResult.lVal );
AfxMessageBox( str );
*/
SysFreeString (szServerIP);
SysFreeString (szServerPort);
pDisp->Release(); // 释放接口指针
}
http://www.vckbase.com/document/viewdoc/?id=1493
COM组件设计与应用(四)
简单调用组件
杨老师 个人专栏http://www.vckbase.com/vckbase/columnist/yangfeng/
对于组件的调用有三种方式:
1。第一种是最原始的调用,采用CoGetClassObjec()或者CoCreateInstance()
它需要对象ID,接口ID,进程类型:(CLSCTX_LOCAL_SERVER ClSCTX_INPROC_SERVER CLSCTX_REMOTE_SERVER),如果聚合还需要外部接口指针,接口指针。
2。第二种是采用智能接口指针,需要导入tlb或者dll,例如IRootPtr,Ptr是在接口的基础上添加的,从而成为智能指针,IRootPtr.CreateInstance(ID或者对象名称);__uuidof(Root)
3.采用包装类的形式,通过VC导入Dll或者tlb生成包装类,进而进行调用。
呵呵,常用的调用DLL也算调用COM组件吧
那第三种就可分为loadlibrary getAddress Freelibrary 和#pragma comment(lib, "****.lib");啦