小弟初学COM,碰到以下问题
函数在IDL里声明
[
object,
uuid(25ABD15A-3B45-4E53-8CFB-70B0C5D6F0F0),
helpstring("IXEngine Interface"),
pointer_default(unique)
]
interface IX : IUnknown
{
[helpstring("Method CreateSession")]
HRESULT CreateSession([in] GUID cookie, [in, string] BSTR alias, [out] IXSession **ppISession);在客户机端,我调用这个进程外COM,然后跟踪到CreateSession中,发现
hr = p->CreateSession(cookie, L"abcd", &ps);cookie能正确的被客户端传送到服务器,但是传入的字符串abcd,到了服务器那就变成了空如果换成这样调用
wchar_t *str = new wchar_t(5);
wcscpy(str, L"abcd");
hr = p->CreateSession(cookie, L"abcd", &ps);
CreateSession直接返回E_OUTOFMEMORY,连在服务器里设的断点都跑不到,我的理解就是在代理存根那的调用就失败返回了。但是不知道什么原因
函数在IDL里声明
[
object,
uuid(25ABD15A-3B45-4E53-8CFB-70B0C5D6F0F0),
helpstring("IXEngine Interface"),
pointer_default(unique)
]
interface IX : IUnknown
{
[helpstring("Method CreateSession")]
HRESULT CreateSession([in] GUID cookie, [in, string] BSTR alias, [out] IXSession **ppISession);在客户机端,我调用这个进程外COM,然后跟踪到CreateSession中,发现
hr = p->CreateSession(cookie, L"abcd", &ps);cookie能正确的被客户端传送到服务器,但是传入的字符串abcd,到了服务器那就变成了空如果换成这样调用
wchar_t *str = new wchar_t(5);
wcscpy(str, L"abcd");
hr = p->CreateSession(cookie, L"abcd", &ps);
CreateSession直接返回E_OUTOFMEMORY,连在服务器里设的断点都跑不到,我的理解就是在代理存根那的调用就失败返回了。但是不知道什么原因
解决方案 »
- win32下怎样才可以使控件和菜单中的选项变成灰色(只读,不可操作)?
- vc中调用vbscrip,请问vbscrip语句中可以调用vc中的控件吗?
- access数据库 海量INT值怎么存取?
- win32的DLL中如何实现无模式对话框?
- 端口反弹,,这种原理哪有资料/。
- 谁有周长发的《精通VC++图像编程》的源代码
- 《c++编程思想》P22,说预处理宏不能访问类的私有数据,但是我试了可以呀????
- 我有一个关于pb与(EM)射频读卡器的接口的问题
- MessageBox对话框自动显示和销毁,出错,请教
- 从txt读数据
- term does not evaluate to a function.请问这是为什么?
- CListCtrl的checkbox,如何调整它的位置在高度上居中???
或者直接使用ATL中的CComBSTR也可以。
而使用SysAllocString创建出来的BSTR,天生就满足COM的要求,因为它不仅仅是创建一个WCHAR*缓冲区。
这也是com的优势
bstr很强大
BSTR从类型上看就是WCHAR*,但指针指向的位置不是整个BSTR数据的开头,而是从实际的字符开始,也就是说,BSTR是指在整个BSTR加4个字节的地方。COM在使用时把些地址减去4,并从哪里取得字符串的长度信息。
如果直接传递L"abcd",结果就是在内存里,把字符'a'之前的4个字节给当成了长度,而那个位置上本来应该是什么信息,不得而知,结果当然也就乱了。