纯C++调用ocx出现错误

停止抱怨的第七条虫 2016-04-05 01:25:16
HRESULT hresult;
CLSID clsid;
CoInitialize(NULL);
hresult=CLSIDFromProgID(OLESTR("ACTIVEDEMO6.activedemo6Ctrl.1"), &clsid);
_Dactivedemo6 *t = NULL;
hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(_Dactivedemo6),(LPVOID *) &t);
if(FAILED(hresult))
{
printf("call ocx/dll failed");
return 0;
}
char str[20];
t->hellostr(str);
printf("%s",str);

t->Release();
CoUninitialize();
return 0;
按网上的方法写了上面的程序,在win32控制台工程,编译没有错误。但程序跑到 t->hellostr(str);就出现这样的错误:
Win32test.exe 中的 0x76dbc52f 处未处理的异常: Microsoft C++ exception: _com_error @ 0x0018fc4c 。

急,求助大神了
...全文
497 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
@珍惜生命远离CPP 有个问题不得不打扰大神。 我用的VS2003。我用C++ 调了VB.net的库,VC++控制台工程测试能用。但是封装成DLL文件来调用就出了Fatal Execution Engine Error问题。
  • 打赏
  • 举报
回复
引用 3 楼 qq_27385509 的回复:
@h2plus0 Thanks 这确实是我该注意的东西。但是它应该不是这个错误的主要原因,因为我也有写了一个 BSTR Cactivedemo6Ctrl::helloworld() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); BSTR bstrtest = ::SysAllocString(L"hello"); return bstrtest; } 这个helloworld被调用同样会奔溃。
COM方法必须返回 HRESULT
  • 打赏
  • 举报
回复
引用 1 楼 qq_27385509 的回复:
ocx是MFC activeX创建的一个activedemo6工程,里面就加了这个事件(上面调的hellostr) void Cactivedemo6Ctrl::hellostr(CHAR* str) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); strcpy(str,"hello"); }
参数应该为BSTR*
  • 打赏
  • 举报
回复
@h2plus0 Thanks 这确实是我该注意的东西。但是它应该不是这个错误的主要原因,因为我也有写了一个 BSTR Cactivedemo6Ctrl::helloworld() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); BSTR bstrtest = ::SysAllocString(L"hello"); return bstrtest; } 这个helloworld被调用同样会奔溃。
  • 打赏
  • 举报
回复
idl中
HRESULT hellostr([out,retval]BSTR*);

HRESULT hellostr(BSTR* retval )
{
 *retval = ::SysAllocString(L"hello");
return S_OK;
}
  • 打赏
  • 举报
回复
@珍惜生命远离CPP 谢谢,大神你出现我放心多了。 还是请教下,COM方法必须返回 HRESULT 是什么意思?void?能简单写个例子吗?
h2plus0 2016-04-05
  • 打赏
  • 举报
回复
记得COM里所有的字符串应该使用 BSTR, BSTR的结构和char*有点不同, 在BSTR地址的前面包括了字符串的长度 详情: https://msdn.microsoft.com/en-us/library/windows/desktop/ms221105%28v=vs.85%29.aspx good luck
  • 打赏
  • 举报
回复
ocx是MFC activeX创建的一个activedemo6工程,里面就加了这个事件(上面调的hellostr) void Cactivedemo6Ctrl::hellostr(CHAR* str) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); strcpy(str,"hello"); }

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧