我做了一个Dcom服务器,在服务器端的接口为
[id(3), helpstring("method TestExcute")] HRESULT TestExcute([in]BSTR sql,[out, retval]BSTR *result);STDMETHODIMP CDBServ::TestExcute(BSTR sql, BSTR *result)
{
// TODO: Add your implementation code here
return S_OK;
}
我在客户端调用TestExcute方法,总是发生异常 BSTR bstr;
BSTR sqlBstr = _com_util::ConvertStringToBSTR(LPCTSTR(str));
pIDBserv->TestExcute(sqlBstr,&bstr);
[id(3), helpstring("method TestExcute")] HRESULT TestExcute([in]BSTR sql,[out, retval]BSTR *result);STDMETHODIMP CDBServ::TestExcute(BSTR sql, BSTR *result)
{
// TODO: Add your implementation code here
return S_OK;
}
我在客户端调用TestExcute方法,总是发生异常 BSTR bstr;
BSTR sqlBstr = _com_util::ConvertStringToBSTR(LPCTSTR(str));
pIDBserv->TestExcute(sqlBstr,&bstr);
解决方案 »
- 能不能在windows可输入容器内的右键菜单里添加菜单项??
- 求软件开发毕业论文
- VC对EXCEL操作的问题
- uxtheme.h和uxtheme.lib这两个文件,谁能传给我
- 谁有ASP Web Server的源代码,支持100% ASP对象集合
- 大家说说这种定时计数方法对硬件有什么要求阿?
- 如何用VC编写MP3播放器?
- VC中如何去读写一个USB设备的端点
- LoadBitmap出错!!
- 请问哪里能找到CCD,CMOS图象传感器原理的文章?
- 怎样用CFileDialog类和CFile类仿照系统保存对话框的样式 按照用户指定的路径和文件名保存文件?
- 我想在我的程序中运行DOS命令,我应该怎么做?
BSTR sqlBstr = _com_util::ConvertStringToBSTR(LPCTSTR(str));
pIDBserv->TestExcute(sqlBstr,&bstr);“当把字符串作为[in]参数传个一个方法时,调用方有责任在调用之前先调用SysAllocString,然后在方法完成(返回)之后调用SysFreeString。”(摘自COM本质论)
只是一个原则上的编码方式问题,并不是说在组件中分配内存然后客户端释放就不能实现。其实关于COM中的字符串问题更好的教材是《深入解析ATL》,讨论相当详尽。
interface Ihorse : IDispatch
{
[id(1), helpstring("method eat")] HRESULT eat([in]BSTR str,[in,out]BSTR* ret);
};
//
STDMETHODIMP Chorse::eat(BSTR str, BSTR *ret)
{
CComBSTR strt = str;
strt.Append(OLESTR("XXX"));
*ret = strt.Copy(); // TODO: Add your implementation code here return S_OK;
}
3.
void CTestclientDlg::OnButton1()
{
::CoInitialize( NULL );
CLSID clsid = CLSID_horse;
COAUTHINFO cai = {
RPC_C_AUTHN_NONE,
RPC_C_AUTHZ_NONE,
0,
RPC_C_AUTHN_LEVEL_NONE,
RPC_C_IMP_LEVEL_IMPERSONATE,
0,
EOAC_NONE
};
MULTI_QI mqi = { &IID_Ihorse, 0, 0 };
COSERVERINFO csi = { 0, OLESTR("127.0.0.1"), &cai, 0 };
HRESULT hr = CoCreateInstanceEx(clsid, NULL,
CLSCTX_REMOTE_SERVER, &csi, 1, &mqi);
if(FAILED(hr))
{
AfxMessageBox("生成接口出错,可能没有初使化com!");
::CoUninitialize();
return;
}
Ihorse *pGN = (Ihorse *)mqi.pItf;
CComBSTR str = "sdf";
CComBSTR str1;
pGN->eat(str,&str1);
CString strout = str1.Copy();
AfxMessageBox(strout);
::CoUninitialize();
}