问题:您编写以下代码段以使用平台调用从Win32应用程序编程接口(API)调用函数.
string personname = "N?el";string msg = "Welcome" + personname + "to club"!";bool rc = User32API.MessageBox(0,msg,personname,0);
您需要定义一个最佳编组字符串数据的方法原型.您应该使用哪个代码段?
// A.[Dllimport("user32",CharSet = CharSet.Ansi)]public static extern bool MessageBox(int hWnd,string text,string caption,uint type);}// B.[Dllimport("user32",EntryPoint = "MessageBoxA",[MarshalAs(UnmanagedType.LPWStr)]string text,[MarshalAs(UnmanagedType.LPWStr)]string caption,uint type);}// C. - Correct answer[Dllimport("user32",CharSet = CharSet.Unicode)]public static extern bool MessageBox(int hWnd,uint type);}// D.[Dllimport("user32",uint type);}
为什么正确的答案是C?不可能它也是A?唯一的区别是它将是ANSI而不是Unicode.
我知道它不能是D,因为我们选择Unicode作为字符集,然后使用ANSI函数作为入口点.
B为什么不工作?
解决方法string personname = "N?el";
这个字符串被这个问题所询问的确切问题弄乱了.毫无疑问,原版中看起来像这样:
string personname = "Nöel";
ö往往是一个问题,它的字符代码不是ASCII字符集,默认系统代码页可能不支持.这是当你pinvoke ANSI版本的MessageBox,也就是MessageBoxA时使用的.真正的函数是MessageBoxW,它采用utf-16编码的Unicode字符串.
MessageBoxA是旧版windows中使用的遗留函数,早在程序仍然使用8位字符串时.它还没有完全消失,许多C和C程序仍然倾向于使用8位编码. MessagBoxA通过将8位编码字符串转换为Unicode然后调用MessageBoxW来实现.如果您首先使用Unicode字符串,则速度慢且有损.
所以评价4个版本:
答:使用MessageBoxA 8位编码,有风险.B:使用MessageBoxA Unicode,失败.C:使用MessageBoxW Unicode,不错D:使用MessageBoxA Unicode,失败.
总结以上是内存溢出为你收集整理的c# – DllImport – ANSI与Unicode全部内容,希望文章能够帮你解决c# – DllImport – ANSI与Unicode所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)