将Unicode字符串从C#发送到C++;在一个项目中工作,但不在另一个项目中工作
我在VS2017中构建了两个项目的测试线束解决方案,一个C项目,我发送Unicode字符串和一个C++ DLL,在那里我接收它并在MaseBox中显示它。 我的C#代码是: <>我的C++代码是:将Unicode字符串从C#发送到C++;在一个项目中工作,但不在另一个项目中工作,c#,c++,dll,unicode,pinvoke,C#,C++,Dll,Unicode,Pinvoke,我在VS2017中构建了两个项目的测试线束解决方案,一个C项目,我发送Unicode字符串和一个C++ DLL,在那里我接收它并在MaseBox中显示它。 我的C#代码是: 我的C++代码是: __declspec(dllexport) bool __stdcall SendString(wchar_t *IncomingPath) { MessageBoxW( NULL, IncomingPath, L"Header"
__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++中的来自主文件()的代码(从/dp>)将C++项目从DLL更改为EXE,并称为PrimeOnFiFLE函数。
wchar_t *temp = L"C:/Z2C6BC1C克 - Copy.jpg";
ProcessOneFile(temp);
我得到:
<> P>所以数据似乎不存在从C到C++的边界上的传递。
两种解决方案都运行在同一台PC上,都在同一Visual Studio(2017)编译,C++项目都有属性->通用->字符集设置为“使用Unicode字符集”。 一定是有什么项目相关的原因导致了这一点,任何帮助将不胜感激。我不是C++的家伙,我正在尝试从Github上获得代码所需要的功能。
谢谢您的建议。首先停止从您的函数返回
cv::Mat
。导出类
从来都不可取。此外,未导出OpenCV
cv::Mat
此外,为了避免名称混乱,函数定义前面加上extern“C”
:
extern“C”\uuu declspec(dllexport)void\uu stdcall ProcessOneFile(wchar\u t*FullFilePath)
cv::Mat的意义是什么?@TripleAntigen如果在C代码中写入/弹出相同的消息字符串,会得到什么?另外,请检查两个项目中.cs
文件的文本编码(UTF-8、UTF-16LE、BOM与无BOM等)。@dxiv谢谢,我在调用ProcessOneFile之前的.cs文件中添加了一个messagebox,它与第一幅图中的显示一样正确。Notepad++将它们都报告为UTF-8-BOMI,并从返回中删除cv::Mat
。不建议导出类
。我还将导出的函数定义为extern“C”\u declspec(dllexport)void\u stdcall ProcessOneFile(wchar\u t*FullFilePath)
,以避免名称混乱问题。另外,您构建的体系结构是什么,x86还是x64?您的测试项目使用了什么拱门?此外,由于明显的原因,OpenCV
cv::Mat
肯定不会被导出。另一方面,您确实需要增加编译器警告。如果您正在使用VS
将其设置为W4
,非常感谢,这就解决了我的问题。我现在可以开始长头发了。
wchar_t *temp = L"C:/Z2C6BC1C克 - Copy.jpg";
ProcessOneFile(temp);