将BSTR从本机c++传递到托管c#dll时出现问题
Problems passing a BSTR from native c++ to managed c# dll
如果以前有人回答过这个问题,请原谅,但我还没有找到适合我的解决方案。我看到过很多将字符串从C#传递到C++的答案,但没有那么多相反的答案。问题是我有一个c++应用程序,它需要加载一个c#dll并向它传递一个字符串。
在C#方面,我已经通过com.公开了这一点
namespace DriverCollect
{
public interface IDriverInfo
{
int GetDriverInfo(ref string name);
};
public class DriverInterface:IDriverInfo
{
public int GetDriverInfo(ref string drivername)
{
DriverInfo myInfo = new DriverInfo(@"c:logfile.txt") ;
myInfo.Collect(drivername);
return 0;
}
}
}
我用regasm注册了tbl文件,这就是我在OLE类型库查看器中看到的
[
odl,
uuid(F3005FE7-DBA1-3FB6-807E-E66626EC875B),
version(1.0),
dual,
oleautomation,
custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "DriverCollect.IDriverInfo")
]
interface IDriverInfo : IDispatch {
[id(0x60020000)]
HRESULT GetDriverInfo(
[in, out] BSTR* name,
[out, retval] long* pRetVal);
};
在C++方面,这是我的测试用例。
HRESULT hr = CoInitialize(NULL);
IDriverInfoPtr pDriverInfo(__uuidof(DriverInterface));
if(pDriverInfo)
m_pDriverInfo = pDriverInfo;
BSTR s(L"c:\xmltestdir\cdromarm.sys");
long ret = 1;
hr = m_pDriverInfo->GetDriverInfo(&s,&ret);
CoUninitialize()
发生的情况是,当C#dll接收到BSTR时,它总是空的。除此之外,我没有得到任何错误,当函数返回并且HRESULT为S_OK时,ret值会发生更改
我尝试过通过值传递BSTR,也达到了同样的效果。
想法?
您的BSTR在声明为时没有长度前缀
BSTR s(L"c:\xmltestdir\cdromarm.sys");
尝试将其声明为
BSTR s = SysAllocString(L"c:\xmltestdir\cdromarm.sys");
从这里开始,如果将一个简单的Unicode字符串作为参数传递给需要BSTR的COM函数,则COM函数将失败
此外,还可以考虑使用CComBSTR或_bstr_t,以便在出现异常时为您管理内存(从OLE堆中分配和释放)。
相关文章:
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- 发生此错误:在0x0F2BFB7C(基于.dll)时引发异常 尝试更改大小是问题吗?
- 系统错误:程序无法启动,因为您的计算机中缺少MSVCP140D.DLL。尝试重新安装该程序以解决此问题
- C++ DLL 堆内存分配问题
- C++ DLL 运行时错误"abc.dll is not a valid WIN32 application" 。请帮助解决这个问题
- DLL 导出导致唯一指针出现问题
- 如何解决python35的问题.dll'没有找到?
- C++ API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL依赖项问题
- 问题在具有依赖性时从其他路径上加载DLL的DLL
- 我的自定义 C++ DLL 的 C# 项目中的 DLL 端口有什么问题?
- 潜在 DLL 兼容性问题的摘要?
- 从C++调用 Delphi DLL IStream 参数的问题
- 清理跨越Windows DLL模块边界的堆分配资源时出现问题
- 在Windows Server 2003中注册dll时出现问题
- DLL和EXE中具有相同名称和父级但实现不同的类中的问题
- 在C 中的DLL中解决模板的问题
- 多个DLL的问题
- USB继电器DLL问题-继续
- pImpl是否从根本上解决了c++ DLL问题?
- 共享对象(DLL)问题