|
1、使用ATL建立一个包含2个接口的COM组件,并在其中一个自动化接口中实现字符串的小写转换(如:将HELLO转换成hello);在另一个普通的接口中实现2个方法:两数之间的减法(如:a-b)和两数之间的除法(如:a/b);参数类型自行设计。
2、使用VC Win32 Console Application进行客户程序的开发,达到调用该组件中这3个方法的目的。(必须通过IDispatch接口进行字符串的小写转换调用,两个接口之间使用QueryInterface()使用进行切换,然后通过Vtable直接调用普通COM接口中的减法和除法调用,自行选取原始接口指针或智能指针)。
以下
是小弟的用户程序:
#include<atlbase.h>
#include<comutil.h>
#include<iostream.h>
#import "E:\ATLPjcts\Level_C\Debug\Level_C.dll"
int main(int argc, char* argv[])
{
HRESULT hResult;
hResult = CoInitialize(NULL);
if (FAILED(hResult))
{
cout<<"Initialize COM library failed!\n";
return -1;
}
GUID Clisd;
hResult = ::CLSIDFromProgID(L"Level_C.MyIntface", &Clisd);
if (FAILED(hResult))
{
cout<<"Can't find the CLSID!\n";
return -2;
}
IDispatch * pIDisp = NULL;
hResult = CoCreateInstance(Clisd, NULL,
CLSCTX_INPROC_SERVER, IID_IDispatch, (void **)&pIDisp);
if (FAILED(hResult))
{
cout<<"Create object failed!\n";
return -2;
}
/////////////////////////////////////////////////////////////////////////////////////
CComBSTR BSFunName1(L"Upper"); // 准备取得 Upper 函数的序号 DispID
DISPID dispID1; // DispID序号
hResult = pIDisp->GetIDsOfNames(// 根据函数名,取得序号的函数
IID_NULL,
&BSFunName1, // 函数名称
1, // BSFunName3中的元素个数
LOCALE_SYSTEM_DEFAULT, // 使用系统默认的语言环境
&dispID1); // 返回值
if (FAILED(hResult))
{
cout<<"GetIDsOfNames failed!\n";
return -2;
}
VARIANTARG bstr[1]; // 所需要的参数
bstr[0].vt = VT_BSTR; bstr[0].bstrVal = SysAllocString(L"hello world"); // 参数
DISPPARAMS dispParams1 = { bstr, NULL, 1, 0 }; // 把参数包装在这个结构中
VARIANT Result1; // 结果
hResult = pIDisp->Invoke( // 调用
dispID1, // 函数由 dispID 指定
IID_NULL,
LOCALE_SYSTEM_DEFAULT, // 使用系统默认的语言环境
DISPATCH_METHOD, // 调用的是方法,不是属性
&dispParams1, // 参数
&Result1, // 返回值
NULL, // 不考虑异常处理
NULL); // 不考虑错误处理
if (FAILED(hResult))
{
printf("Invoke failed!\n");
return -2;
}
char *p=_com_util::ConvertBSTRToString(Result1.bstrVal);
cout<<p<<endl;
////////////////////////////////////////////////////////////////////////////////////////////////////
IMyMethod * pIMyMethod;
IMyIntface * pIMyIntface;
long a=890,b=90;
long result2;
hResult = pIDisp->QueryInterface(IID_IMyIntface,(void**)pIMyIntface);
if(FAILED(hResult))
{
cout<<"queryintface IMyIntface is failed!\n";
return -2;
}
hResult = pIMyIntface->QueryInterface(IID_IMyMethod,(void**)pIMyMethod);
if(FAILED(hResult))
{
cout<<"queryintface IMyMethod is failed!\n";
return -2;
}
result2=pIMyMethod->Sub(a,b);
cout<<"a - b = "<<result2<<endl;
pIDisp->Release();
CoUninitialize();
return 0;
}
错误是:
E:\ATLPjcts\test\test.cpp(73) : error C2065: 'IMyMethod' : undeclared identifier
E:\ATLPjcts\test\test.cpp(73) : error C2065: 'pIMyMethod' : undeclared identifier
E:\ATLPjcts\test\test.cpp(73) : warning C4552: '*' : operator has no effect; expected operator with side-effect
E:\ATLPjcts\test\test.cpp(74) : error C2065: 'IMyIntface' : undeclared identifier
E:\ATLPjcts\test\test.cpp(74) : error C2065: 'pIMyIntface' : undeclared identifier
E:\ATLPjcts\test\test.cpp(74) : warning C4552: '*' : operator has no effect; expected operator with side-effect
E:\ATLPjcts\test\test.cpp(77) : error C2065: 'IID_IMyIntface' : undeclared identifier
E:\ATLPjcts\test\test.cpp(84) : error C2227: left of '->QueryInterface' must point to class/struct/union
E:\ATLPjcts\test\test.cpp(84) : error C2065: 'IID_IMyMethod' : undeclared identifier
E:\ATLPjcts\test\test.cpp(90) : error C2227: left of '->Sub' must point to class/struct/union
请各位老大帮帮我,小弟感激不尽!! |
|