gpt4 book ai didi

c++-cli - 从 C++/CLI 指针转换为 native C++ 指针

转载 作者:行者123 更新时间:2023-12-03 20:28:22 24 4
gpt4 key购买 nike

我遇到了将 C++/CLI 指针转换为 native C++ 指针的问题。这是背景:
我正在使用 C++/CLI 编写一个 Windows 窗体应用程序。应用程序调用多个 COM 接口(interface)。通过 COM 接口(interface)创建对象的实例(在 C++/CLR 类内部)时,我传入 (void**)(&provider)作为 CoCreateInstance 的最后一个参数,如:

HRESULT CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, (void**)(&provider));

但是,我得到编译器错误:无法从 cli::interior_ptr<Type> 转换至 void ** .
我对此进行了一些研究,看起来这是 C++ 和 C++/CLI 中不同类型指针的问题。任何人都对此有任何了解,也许有关于如何修复它的提示?提前谢谢!

首先,感谢您的帮助!

正如 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);

我无法从 interior_ptr 转换至 interior_ptr .
这一切都归结为转换 interior_ptr 的问题。至 void** .像这样: (void**)interiorPtr , 其中 interiorPtr当然是 interior_ptr .这有什么想法吗?

最佳答案

我相信您必须将指针标记为“固定”(在托管代码中),然后将字节复制到某个非托管内存区域,然后使用指向该区域的指针。例如,这是我曾经得到的一段代码,它将指向托管 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 );
}

请注意我必须如何获得指向 bytes 的“固定”指针。 GetBytes() 返回的数组函数,然后将其转换为 char*在将其传递给 std::string 之前构造函数。我相信这是避免托管内存子系统移动 bytes 所必需的。当我将字节复制到 STL 字符串中时,数组在内存中。

在你的情况下,尝试更换
CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, (void**)(&provider)); 


pin_ptr<void *> pinnedPtr = &provider;
CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, (void**)pinnedPtr);

看看这是否有效。

关于c++-cli - 从 C++/CLI 指针转换为 native C++ 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1271022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com