将 Unicode 字符串从 C# 发送到在一个项目中工作但不在另一个项目中工作的 C++

Sending Unicode string from C# to C++ working in one project but not another

我在 VS2017 中构建了一个包含两个项目的测试工具解决方案,一个是 C# 项目,我在其中发送一个 unicode 字符串,另一个是 C++ DLL,我在其中接收它并将其显示在 MessageBox 中。

我的 C# 代码是:

[DllImport(@"TestDLL.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
    private static extern void SendString([MarshalAs(UnmanagedType.LPWStr)] string str);

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        SendString("Test2 String ☻我是美国人");
    }

我的 C++ 代码是:

__declspec(dllexport) bool __stdcall SendString(wchar_t *IncomingPath)
{
    MessageBoxW(
        NULL,
        IncomingPath,
        L"Header",
        MB_ICONINFORMATION
    );
    return true;
}

这按预期工作,输出如下:

太棒了。因此,我将代码移植到一个更大的解决方案中,再次使用与所述相同的小型 C# 测试项目,以及一个更大的现有 C++ 项目,我需要在其中包含相同的字符串传递功能。

这次我的C#代码非常相似:

  [DllImport(@"my.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
    private static extern void ProcessOneFile([MarshalAs(UnmanagedType.LPWStr)] string str);

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        ProcessOneFile("Test2 String ☻我是美国人");
    }

和C++代码基本一样

    __declspec(dllexport) cv::Mat __stdcall ProcessOneFile(wchar_t *FullFilePath) {
    MessageBoxW(
        NULL,
        FullFilePath ,
        L"Headervv",
        MB_ICONINFORMATION
    );
}

然而我得到这个:

为了测试,我将 C++ 项目从 DLL 更改为 exe,并在本地调用 ProcessOneFile 函数,使用同一 C++ 文件中 main() 中的以下代码:

wchar_t *temp = L"C:/Z2C6BC1C克 - Copy.jpg";
ProcessOneFile(temp);

我得到:

所以数据似乎无法在从 C# 到 C++ 的边界传输中幸存下来。

两种解决方案都是 运行 在同一台 PC 上,都在相同的 Visual Studio (2017) 中编译,两个 c++ 项目都有属性 -> 常规 -> 字符集设置为“使用 Unicode 字符集” ".

一定是某些与项目相关的问题导致了此问题,我们将不胜感激。我根本不是 C++ 专家,我正在尝试从 Github.

上的代码中获取我需要的功能

感谢任何建议。

首先停止从您的函数返回 cv::Mat。导出 class 从来都不是可取的。此外 OpenCV cv::Mat 未被导出。

此外,为避免名称混淆,在函数定义前加上 extern "C":

extern "C" __declspec(dllexport) void __stdcall ProcessOneFile(wchar_t *FullFilePath)