将 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)
我在 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)