如何在调用WindowsPhoneRuntimeComponent时使用字节数组作为参数

本文关键字:字节数 字节 数组 参数 调用 WindowsPhoneRuntimeComponent | 更新日期: 2023-09-27 17:50:14

首先,大家好!我想从我的windows手机应用程序访问2 c++函数。所以我遵循本教程的每一步,我设法调用函数作为本教程的海报。现在我想访问我自己的函数,所以我在头和。cpp文件中创建了类,只要我的函数不是公共的,项目就可以构建。意味着我不能访问它们。

 public ref class Base64Encoding sealed
{
  public:
    char *EncodeData(char *data, int length, int  *resultLength); //this doesnt compile
    char *DecodeString(char *data, int *resultLength); //this compiles buts inaccessible
};

我得到一个返回异常说错误C3992:公共成员的签名包含无效类型char。我做了一些谷歌搜索,据我所知,我不能发送char类型的参数,因为它的非托管代码或类似的东西。

那么问题是什么呢?为什么我不能传递char类型的参数?

更新

我遵循了robwirving的建议,现在标题看起来像这样。

public ref class Base64Encoding sealed
    {
    public : Platform::String^ EncodeData(String^ StringData);
    public : Platform::String^ DecodeString(String^ StringData);
    };

现在为了从字符串^ StringData参数中获取char*数据,我在我的。cpp

#include <string>
#include <iostream>
#include <msclr'marshal_cppstd.h>
using namespace Platform;
using namespace std;
String^ EncodeData(String^ StringData)
{ 
    // base64 lookup table. this is the encoding table for all 64 possible values
    static char *figures = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    msclr::interop::marshal_context context;
    std::string s = context.marshal_as<std::string>(StringData);
    char *data = new char[s.size() + 1];
    int length = s.length;
    int *resultLength = s.length;
    data[s.size()] = 0;
/* bla bla some functions irrelevant*/
.
.
.
return StringFromAscIIChars(result);
}
static String^ StringFromAscIIChars(char* chars)
{
    size_t newsize = strlen(chars) + 1;
    wchar_t * wcstring = new wchar_t[newsize];
    size_t convertedChars = 0;
    mbstowcs_s(&convertedChars, wcstring, newsize, chars, _TRUNCATE);
    String^ str = ref new Platform::String(wcstring);
    delete[] wcstring;
    return str;
}

但是现在我得到了2个错误的构建。

1:错误C1114: WinRT不支持使用托管程序集

2: IntelliSense:不允许使用普通指针指向c++/CX映射ref类或接口类

如何在调用WindowsPhoneRuntimeComponent时使用字节数组作为参数

你问题的答案是正确的。不能在WinRT组件的公共函数中使用char。但是,您可以使用字符串,我建议将您的函数更改为:

public ref class Base64Encoding sealed
{
  public:
    Platform::String^ EncodeData(Platform::String^ data); 
    Platform::String^ DecodeString(Platform::String^ data);
};

在你的编码/解码函数的定义中,你可以将你的输入从一个Platform::String^转换成一个char数组,调用你原来的c++函数,然后将返回值转换回一个Platform::String^

我知道这看起来像是很多额外的工作,但它使使用WinRT组件的c#更容易进行互操作。

更新:

我认为您的额外错误可能来自包含mscr 'marshal_cppstd.h以及您将Platform::String^转换为std:: String的方式。

参考这篇文章如何从Platform::String^转换为char*:如何将Platform::String转换为char*?