stringbuilder-C#中调用C++Dll接口,字符串编码问题

问题描述

C#中调用C++Dll接口,字符串编码问题

在C#中调用C++Dll接口,接口返回一个多字节字符串,然后再C#中再次转码为宽字节字符串。
字符串内容都为汉字。

**_问题:

   如果汉字为偶数个,则一切正常;
   如果汉字为奇数个,则C#获得的多字节字符串内容的最后一个字节被篡改成‘?’的ascll码。(多字节编码时,每个汉字占三个字节)
       本人没多少币,全部家当拿出来了,求大神指点。**_

C++代码:

// 宽字节转多字节
__declspec(dllexport) void TCharToChar(LPCWCH tchar, char * _char)
{
//获取字节长度
int iLength = WideCharToMultiByte(CP_UTF8, 0, tchar, -1, NULL, 0, NULL, NULL);
//将tchar值赋给_char

WideCharToMultiByte(CP_UTF8, 0, tchar, -1, _char, iLength, NULL, NULL);
}

// 多字节转宽字节
__declspec(dllexport) void CharToTChar(char* _char, LPWSTR tchar)
{
int iLength = MultiByteToWideChar(CP_UTF8, 0, _char, -1, NULL, 0);
MultiByteToWideChar(CP_UTF8, 0, _char, -1, tchar, iLength);
}

__declspec(dllexport) char* GetStr()
{
setlocale(LC_ALL, "chs");

LPCWCH pTChar = L"好";
char* pChar = new char[50];
memset(pChar, 0, 50);
TCharToChar(pTChar, pChar);

return pChar;

}

C#代码:

class Program
{
private const string strDllPath = "DllTest.dll";

[DllImport(strDllPath, EntryPoint = "GetStr", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
extern public static IntPtr GetStr();

// 多字节转宽字节
[DllImport(strDllPath, EntryPoint = "CharToTChar", CallingConvention = CallingConvention.Cdecl)]
extern public static void CharToTChar(string src, [MarshalAs(UnmanagedType.LPWStr)]string des);

// 宽字节转多字节
[DllImport(strDllPath, EntryPoint = "TCharToChar", CallingConvention = CallingConvention.Cdecl)]
extern public static void TCharToChar(string src, StringBuilder des);

static void Main(string[] args)
{
    IntPtr ptr = GetStr();
    string str = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(ptr);

    bytes = System.Text.Encoding.Default.GetBytes(str);
    string strResult = System.Text.Encoding.Default.GetString(bytes);

    Console.WriteLine(strResult);
}

}

解决方案

C#调用C++DLL时的编码转换-编码、字符集
C#调用C++Dll字符串返回为空的问题

时间: 2024-10-07 19:28:36

stringbuilder-C#中调用C++Dll接口,字符串编码问题的相关文章

delphi-替换Delphi中调用的dll

问题描述 替换Delphi中调用的dll 在一段Delphi编写的dll中调用了另外一个一个A.dll,现在想将这个A.dll替换为自己写的B.dll.只是知道A大概的功能,B是自己写的,中间需要注意些什么? 解决方案 用depend看下导出表,有什么函数名,函数序数,然后用ollydbg之类的工具调试,看看参数是怎么传的,通过堆栈可以分析出来. 然后自己照着写. 解决方案二: Delphi 调用VC的DLLDelphi调用DLL中的接口Delphi调用DLL中的接口

在SQL Server 2008中调用.net,dll

原文:在SQL Server 2008中调用.net,dll T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可以在SQL Server 2008中扩展C#程序来完成循环等过程式的查询,或者其他SQL不便实现的功能.这个随笔中将介绍在SQL Server中扩展C#程序实现正则表达式的替换功能. 新建一个类库程序命名为Regex,打开Visual Studio 2008,点击File,点击New,点击Project,在

关于在winform中调用飞信web接口出现的问题。

问题描述 我在winform中引用飞信web接口后,然后进一步通过代理类的对象来调用方法,,,可是,,在调用了函数Login(stringXXX,stringXXX)并写好了相关代码后,,,运行程序结果显示登录不上,,,弹出"com=loginerrXXX"提示.(注:我是在.net4.0上开发该程序的)附:经过一些相关的测试,发现飞信服务器那边其实是收到了我的登录名以及密码的,,,就是始终登录不上啊!!!~~~这才是问题所在啊~~~ 解决方案 解决方案二:哪位大虾帮帮啊~解决方案三:

java基本类库中调用的dll的具体实现在jdk的哪里

问题描述 如题.翻java源码时看到本地方法,只在java类中看到方法声明,但怎么也找到dll具体实现.上网查也没有头绪,求教各位大神 解决方案 解决方案二:应该包含在Java可执行文件中,具体的实现是由操作系统决定.解决方案三:如果在Windows操作系统下,可以用下面的方法研究一下1)安装完整的MicrosoftVisualStudioC++这个步骤主要是要获得dumpbin.exe这个可执行文件我的机器上这个文件在下面这个位置C:ProgramFiles(x86)MicrosoftVisu

asp中调用.net dll文件方法

1. 在.net Visual Studio 中新建一个Class项目. 2. 在项目中新添加一个类,代码如下:  代码如下 复制代码 using System; namespace ClassLibrary1 {    //定义接口,这点很重要 (此接口中的方法与COM组件中的方法一致)     public interface iClass1     {         string   test()   ;     }     public class Class1 : iClass1  

c# 中调用advapi32.dll中的 RegQueryStringValue 如何定义,不知那错了

问题描述 给个c#实例,谢了我是这样定义的,可就是取不出值,[DllImport("advapi32.dll",EntryPoint="RegQueryValueExA",CharSet=CharSet.Ansi,SetLastError=true,ExactSpelling=true)]publicstaticexternintRegQueryStringValue(inthKey,stringlpValueName,intlpReserved,refintlpT

c# 中调用advapi32.dll中的 RegCreateKeyEx如何定义

问题描述 能不能给个c#的实际例子?谢了 解决方案 解决方案二:[System.Runtime.InteropServices.DllImport("advapi32.dll")]privatestaticexternintRegCreateKeyEx(uinthKey,stringlpSubKey,uintReserved,stringlpClass,uintdwOptions,uintsamDesired,uintlpSecurityAttributes,refuintphkRes

java中调用GDAL DLL的实现方法_java

步骤:1.编译GDAL(编译过程忽略).2.将编译过后的动态链接库拷贝到{JAVA_HOME}\jre\bin目录下,如下图:   3.将编译过后的gdal.jar引入java工程,测试调用,代码如下: 复制代码 代码如下:       @Override    protected boolean doIsAvailable() throws Throwable {        System.loadLibrary("gdaljni");        return true;   

在MFC中调用DLL .

欲在.EXE 中调用PRO.DLL PRO.DLL中函数如: long MenuExecute( char *, long , HWND , long , char *, long , void * );   在.EXE端程序:   HINSTANCE hPro= ::LoadLibrary("Pro.dll"); if(hPro == NULL) {     return; } else {       typedef long (*MENU_EXECUTE)( char *, lo