从C++/CLI指针转换为本机C++指针

Tom*_*ter 15 interop c++-cli

我遇到了将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_ptrpin_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_ptrinterior_ptr.这一切都归结到转换的问题interior_ptrvoid**.就像这样:(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'指针指向bytesGetBytes()函数返回的数组,然后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)

看看是否有效.