C#使用VC++6.0编写的ATL组件传字符串参数被截断?

社会栋梁 2010-03-25 02:08:20
ATL部分代码,这里的字符串都是BST类型,类型一定没有问题
STDMETHODIMP CCapCon::get_strDevice(BSTR *pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())

// TODO: Add your implementation code here
*pVal = m_strDevice;
return S_OK;
}

STDMETHODIMP CCapCon::put_strDevice(BSTR newVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())

// TODO: Add your implementation code here
m_strDevice = newVal;
return S_OK;
}

UNICODE发布,字符编码也没有问题,只是传入参数组件读取时就变短了

C#部分代码
MyControl.strDevice = textBox1.Text;
MyControl.Start();


结果时
textBox1输入
\\?\usb#vid_04fc&pid_0561#5&120235ec&0&2#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
组件收到参数变成了
\\?\usb#vid_04fc&pid_0561#5&120235ec&0&2#{65e8773d-8f56-11口往口佳口

以前也是遇到过VC6.0字符串被截断的问题,至今没有解决
...全文
216 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sgzwiz 2010-03-25
  • 打赏
  • 举报
回复
有可能,VC6我没有
社会栋梁 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sgzwiz 的回复:]
其实是你运气好,运气不好,会让你机器立即死机 :-)
BSTR是个指针,指针一般都是危险的
[/Quote]
http://topic.csdn.net/u/20071112/23/5691b372-8110-421f-8f18-7a5039bc2e31.html
嗯,之前的问题应该也是同样的方法解决,但VC6就没有这种现象,看来VS.NET和VC6对CString的底层实现不一样
sgzwiz 2010-03-25
  • 打赏
  • 举报
回复
其实是你运气好,运气不好,会让你机器立即死机 :-)
BSTR是个指针,指针一般都是危险的
社会栋梁 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sgzwiz 的回复:]
我把vc6项目升级为2008了,vc6的ATL可能不支持CString,你找个ATL的字符串类替换下CString。

你C#用2008,activex用VC6,有这必要吗。
[/Quote]

和vs的版本没关系,我都试过,主要还是*pVal = m_str.AllocSysString();
社会栋梁 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sgzwiz 的回复:]
1、把BSTR m_str;改成CString m_str;
2、

C/C++ code
STDMETHODIMP CAtl::get_Str(BSTR *pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())

// TODO: Add your implementation code here
*pVa……
[/Quote]

没错,哈哈哈
sgzwiz 2010-03-25
  • 打赏
  • 举报
回复
我把vc6项目升级为2008了,vc6的ATL可能不支持CString,你找个ATL的字符串类替换下CString。

你C#用2008,activex用VC6,有这必要吗。
sgzwiz 2010-03-25
  • 打赏
  • 举报
回复
1、把BSTR m_str;改成CString m_str;
2、
STDMETHODIMP CAtl::get_Str(BSTR *pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())

// TODO: Add your implementation code here
*pVal = m_str.AllocSysString();
return S_OK;
}

这样一改,就没问题了。

估计C#的string传递给非托管的DLL后就被GC回收了,而BSTR保存了被释放的内存指针,很危险的,也是错误的。而用CString保存下字符串内容,这样就没问题了。
社会栋梁 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xingyuebuyu 的回复:]
C# code
[System.Runtime.InteropServices.DllImportAttribute("oleaut32.dll", EntryPoint = "SysAllocString")]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.I……
[/Quote]

通过了,还是一样啊
社会栋梁 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xingyuebuyu 的回复:]
C# code
[System.Runtime.InteropServices.DllImportAttribute("oleaut32.dll", EntryPoint = "SysAllocString")]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.I……
[/Quote]
这段代码编译通不过?
社会栋梁 2010-03-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 oyljerry 的回复:]
那如果输入简单字符,比如abcde等,是否会有截断
[/Quote]

短的字符串没有这个问题
xingyuebuyu 2010-03-25
  • 打赏
  • 举报
回复
        [System.Runtime.InteropServices.DllImportAttribute("oleaut32.dll", EntryPoint = "SysAllocString")]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.BStr)]
public static extern string SysAllocString( [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] string param0);

[System.Runtime.InteropServices.DllImportAttribute("oleaut32.dll", EntryPoint = "SysFreeString")]
public static extern void SysFreeString([System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.BStr)] string param0);


你里面字符串都是BST类型,不能直接赋值的。
string s=SysAllocString(textBox1.Text);
MyControl.strDevice = s;

最后要记得释放资源。
SysFreeString(s);

BSTR详解一 -BSTR简介和内部结构
http://zxjgoodboy.blog.sohu.com/71134305.html
oyljerry 2010-03-25
  • 打赏
  • 举报
回复
那如果输入简单字符,比如abcde等,是否会有截断
社会栋梁 2010-03-25
  • 打赏
  • 举报
回复
楼上的朋友,发完了,你把
\\?\usb#vid_04fc&pid_0561#5&120235ec&0&2#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
输入就可以测试
sgzwiz 2010-03-25
  • 打赏
  • 举报
回复
发短消息给你了
社会栋梁 2010-03-25
  • 打赏
  • 举报
回复
我可以把测试代码发给大家,感兴趣的朋友留个邮箱交流一下
healer_kx 2010-03-25
  • 打赏
  • 举报
回复
感觉是中间某个环节的问题,而这个部分你没有给出来。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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