我遇到了将C++/CLI指针转换为本机C++指针的问题.下面是背景:我正在使用C++/CLI编写一个Windows窗体应用程序.该应用程序调用许多COM接口.当通过COM接口创建对象的实例(在C++/CLR类的内部)时,我(void**)(&provider)作为最后一个参数传入CoCreateInstance,如:
HRESULT CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, (void**)(&provider));
Run Code Online (Sandbox Code Playgroud)
但是,我得到编译器错误:无法转换cli::interior_ptr<Type>为void **.我已经对此进行了研究,看起来它是C++和C++/CLI中不同类型指针的问题.任何人都对此有任何了解,也许有关如何修复它的提示?Thanx提前!
首先,感谢你的帮助!
作为Freich的建议,我试图用pin_ptr,但这不是由编译器抱怨的问题,从转换interior_ptr到pin_ptr.如果我改为尝试使用interior_ptr如下:
pin_ptr<void *> pinnedPtr = &provider;
CoCreateInstance(CLSID_MSPRProvider, NULL, CLSCTX_LOCAL_SERVER, IID_IMSPRProvider, ( void** )pinnedPtr);
Run Code Online (Sandbox Code Playgroud)
我得到无法转换interior_ptr为interior_ptr.这一切都归结到转换的问题interior_ptr来void**.就像这样:(void**)interiorPtr,其中interiorPtr当然是interior_ptr.这有什么想法吗?
Fre*_*abe 11
我相信你必须将指针标记为'固定'(在托管代码中),然后将字节复制到某个非托管内存区域,然后使用指针指向它.例如,这里有一段代码,我曾经在某处将指向受管System :: String的指针转换为UTF-8编码的非托管std :: string:
std::string managedStringToStlString( System::String ^s )
{
Encoding ^u8 = Encoding::UTF8;
array<unsigned char> ^bytes = u8->GetBytes( s );
pin_ptr<unsigned char> pinnedPtr = &bytes[0];
return string( (char*)pinnedPtr );
}
Run Code Online (Sandbox Code Playgroud)
注意我是如何得到一个'pinned'指针指向bytes该GetBytes()函数返回的数组,然后char*在将其传递给std::string构造函数之前将其强制转换.我相信这是必要的,以避免托管内存子系统bytes在我将字节复制到STL字符串时在内存中移动数组.
在您的情况下,尝试替换
CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, (void**)(&provider));
Run Code Online (Sandbox Code Playgroud)
同
pin_ptr<void *> pinnedPtr = &provider;
CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, (void**)pinnedPtr);
Run Code Online (Sandbox Code Playgroud)
看看是否有效.
| 归档时间: |
|
| 查看次数: |
21661 次 |
| 最近记录: |