【问题标题】:How to Convert String^ Array to Void* Array如何将 String^ 数组转换为 Void* 数组
【发布时间】:2018-09-11 10:38:23
【问题描述】:

开发环境:Win32桌面应用C++/CLI

让我们有一个这样的数组:

array<String^>^ strArr = gcnew array<String^>(100);

也是这样的数组:

void* ptrArr[100];

我必须将第一个数组的所有元素复制到第二个数组。如何做到这一点?

【问题讨论】:

    标签: arrays type-conversion c++-cli


    【解决方案1】:

    我假设void* ptrArr[100] 实际上是const char* ptrArr[100]void* 实际上可以是任何东西,所以如果不对类型做出假设,就无法回答这个问题。

    因此,您需要做两件事:您需要在类型之间进行转换(包括从 Unicode 代码点到 ANSI 字符),并且您需要拥有属于该内存的东西。

    对于应该为const char* 保存非托管内存的内容有几个选择。最自己动手的路线是Marshal.StringToHGlobalAnsi,但这很痛苦,所以我们将跳过它。 (这需要手动跟踪一堆IntPtr,并在完成后手动调用FreeHGlobal。)

    其他选项是marshal_as 的不同调用。

    您可以将所有String^ 实例转换为std::string 实例,并从中提取const char*。我为此推荐marshal_as&lt;std::string&gt;。在这种情况下,内存归std:string 实例所有,因此ptrArr 仅在stdStrArr 存在时才有效。

    #include <msclr\marshal_cppstd.h>
    
    array<String^>^ strArr = gcnew array<String^>(100);
    std::string stdStrArr[100];
    const char* ptrArr[100];
    
    for (size_t i = 0; i < 100; i++)
    {
        stdStrArr[i] = marshal_as<std::string>(strArr[i]);
        ptrArr[i] = stdStrArr[i].c_str();
    }
    // Memory for ptrArr deallocated when stdStrArr goes out of scope. 
    

    另一种选择是使用marshal_as 直接转换为const char*。为此,您分配一个辅助对象。在这种情况下,内存归marshal_context 实例所有,因此ptrArr 仅在context 存在时才有效。

    #include <msclr\marshal.h>
    
    array<String^>^ strArr = gcnew array<String^>(100);
    marshal_context^ context = gcnew marshal_context();
    char* ptrArr[100];
    
    for (size_t i = 0; i < 100; i++)
    {
        ptrArr[i] = context->marshal_as<const char*>(strArr[i]);
    }
    // Memory for ptrArr deallocated when you call `delete context`, or when it's garbage collected. 
    

    进一步阅读:

    注意事项:

    • 我没有用编译器检查我的语法。可能会有小错误。
    • 似乎应该有一个问题来将此标记为重复。但是,我找不到一个评价很高的“将 String^ 转换为 char*”问题,在答案中使用了marshal_as,并展示了如何使用它的一个很好的例子。李>

    【讨论】:

    • 当然,任何“ANSI”字符集的 Unicode 都可能非常有损。
    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 2015-04-09
    • 1970-01-01
    • 2011-08-13
    • 2022-11-23
    • 2013-01-18
    • 1970-01-01
    相关资源
    最近更新 更多