Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Unicode字符串从C#发送到C++;在一个项目中工作,但不在另一个项目中工作_C#_C++_Dll_Unicode_Pinvoke - Fatal编程技术网

将Unicode字符串从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"

我在VS2017中构建了两个项目的测试线束解决方案,一个C项目,我发送Unicode字符串和一个C++ DLL,在那里我接收它并在MaseBox中显示它。 我的C#代码是:

<>我的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++中的来自主文件()的代码(从/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);