C/C++调用ocx的问题,CoCreateInstance?
VS2008,win7环境下用MFC ActiveX模版生成的ocx,添加了一个简单的加法运算。
编译通过,注册成功。
但是在另起C/C++工程,调用上面的ocx时,就是不成功,求助达人!
==============================================
我的调用方式:
==============================================
#import "C:\\Windows\\SysWOW64\\SmartCard.ocx" \
named_guids
using namespace SmartCardLib;
int main()
{
long abc;
try
{
_DSmartCard* pCrypt = 0 ;
HRESULT hr = CoInitialize(NULL) ;
hr = CoCreateInstance(
CLSID_SmartCard,//Com对象标识符
0,//指向接口IUnknown指针
CLSCTX_INPROC_SERVER,//运行可执行代码上下文
DIID__DSmartCard,//Com对象接口标识符
reinterpret_cast<void**>(&pCrypt)//用来接收指向Com对象接口地址指针变量
);
if ( !SUCCEEDED(hr) )
{
return 0;
}
if(pCrypt)
{
abc = pCrypt->AddFun(1L,2L);
pCrypt->Release();
}
CoUninitialize() ;
}
catch(_com_error *e)
{
MessageBoxA(NULL,e->ErrorMessage(),NULL,NULL);
}
return 0;
}
出错:
CallOcx.exe 中的 0x77b615de 处未处理的异常: Microsoft C++ 异常: 内存位置 0x0035fc80 处的 _com_error。
================================================
查了网上的帖子,看到是这样调用的:
================================================
HRESULT hr = CoCreateInstance(
CLSID_iTunesDetector,//Com对象标识符
0,//指向接口IUnknown指针
CLSCTX_ALL,//运行可执行代码上下文
IID_IiTunesDetector,//Com对象接口标识符
reinterpret_cast<void**>(&pitd)//用来接收指向Com对象接口地址指针变量
);
倒数第二参数到底是 IID_I*** 还是 DIID__D*** ?
而我的 .tlh 文件里 GUID 生成的 只有这四个:
extern "C" const GUID __declspec(selectany) LIBID_SmartCardLib =
{0x6359164a,0xa852,0x4f68,{0x90,0x44,0xea,0x53,0xc8,0xae,0xa9,0x7a}};
extern "C" const GUID __declspec(selectany) DIID__DSmartCard =
{0x59e6e0d4,0x2421,0x43f6,{0x89,0xb8,0x4b,0xbb,0x8d,0x40,0xe3,0xbf}};
extern "C" const GUID __declspec(selectany) DIID__DSmartCardEvents =
{0x647b899a,0x319c,0x48d9,{0xb2,0xa8,0xf9,0x41,0xe9,0x0a,0xd2,0x9e}};
extern "C" const GUID __declspec(selectany) CLSID_SmartCard =
{0xb5e7279b,0xf3c9,0x462b,{0xbf,0xe3,0x54,0x94,0xb2,0x4c,0xa0,0xc1}};
没有 IID_I*** 形式的?
这是为什么?
如何才能调用成功?
[解决办法]
没有容器,在invoke的时候应该是被IsInvokeAllowed返回E_UNEXPECTED 了
[解决办法]