加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – DllImport – ANSI与Uni??code

发布时间:2020-12-16 00:08:36 所属栏目:百科 来源:网络整理
导读:我对下面的测试问题的可能答案有一些疑问: 问题:您编写以下代码段以使用平台调用从Win32应用程序编程接口(API)调用函数. string personName = "N?el";string msg = "Welcome" + personName + "to club"!";bool rc = User32API.MessageBox(0,msg,personName
我对下面的测试问题的可能答案有一些疑问:

问题:您编写以下代码段以使用平台调用从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,失败.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读