C#获取C/C++返回值为wchar_t*的内容
来源:互联网 发布:veket linux最新版本 编辑:程序博客网 时间:2024/05/29 16:58
最近想练习用WPF写界面,调用API的时候发现太麻烦,每个参数要自己声明类型,于是准备写一个DLL,在DLL里面调用API,将结果返回(字符串)。
先上DLL函数,
wchar_t* GetErrorCodeStr(DWORD dwError){ static wchar_t buff[1024] = L"No text found for this error number."; DWORD systemLocale = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL); HLOCAL hlocal = NULL; BOOL fOk = FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwError, systemLocale, (PTSTR)&hlocal, 0, NULL); if (!fOk) { // Is it a network-related error? HMODULE hDll = LoadLibraryEx(TEXT("netmsg.dll"), NULL, DONT_RESOLVE_DLL_REFERENCES); if (hDll != NULL) { fOk = FormatMessage( FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER, hDll, dwError, systemLocale, (PTSTR)&hlocal, 0, NULL); FreeLibrary(hDll); } } if (fOk && (hlocal != NULL)) { wcscpy_s(buff, (wchar_t*)hlocal); LocalFree(hlocal); } return buff;}
就是一个简单的把GetLastError的返回值转换为字符串的函数。
然后C#中声明:
[DllImport("Control.dll", EntryPoint = "GetErrorCodeStr", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]public static extern IntPtr GetErrorCodeStr(int errorCode);
为什么这里函数返回值就写IntPtr而不是string呢,我刚开始也是这么认为的,但是调用的时候会提示堆栈损坏。。。
在翻了很多博客后,了解到对于C/C++的指针,都要用IntPrt。
然后就是调用函数:
IntPtr i = GetErrorCodeStr(errorCode);string temp = Marshal.PtrToStringUni(i, 1024).Split('\r')[0];
然后temp里面就是返回的结果了。
能看到我在获得字符串后,将字符串分片,然后选择了第一个字符串。
因为Marshal.PtrToStringUni函数是从非托管内存复制指定数量的字符,我这里设置1024(DLL里面分配的wchar_t数组也是1024),就导致结果变成了这样:
DLL里面的返回内容:
Marshal.PtrToStringUni(i, 1024)的结果:
真的复制了1024个字符,里面有很多我们不需要的字符,就需要分片后才能拿到我们真正需要的东西。
阅读全文
0 0
- C#获取C/C++返回值为wchar_t*的内容
- ADO.net 里面获取返回值的方法为(c#):
- C#调用C++Dll字符串返回为空的问题
- C语言函数返回值的获取
- C# 调用C写的DLL时 对应的int* 类型返回值转化为 IntPtr
- 返回值为C/C++函数指针的函数
- C:返回值为指针的函数解读
- C语言返回值为结构体的汇编分析
- C`函数的返回值为一个二维数组
- C# 调用C++DLL传递的bool型,返回混乱(c++为false,c#确为ture)
- c程序shell脚本获取返回值的方法
- 获取网页内容的代码(C#)
- C-LODOP打印设计获取返回值
- C函数的返回值
- c 函数的返回值
- 【C】printf的返回值
- c语言获取文件内容
- c#获取url请求的返回值
- SDUT 2017 春夏组队训练赛3
- hdu 2062
- 致自己
- c语言之分割与合并文件
- android插件机制小结
- C#获取C/C++返回值为wchar_t*的内容
- mybatis配置文件
- codeforces 437 c 贪心+图论
- 在VMware Workstation上安装CentOS6.5(字符界面)教程
- 关于队列的相关操作(初始化,判断队满队空,以及入队出队)
- keil 5 for mdk 不支持lpc2138的解决办法
- 学习网站
- spring boot 中@RestController 注解
- angularjs的uigrid中celltemplate如何显示scope里的内容