编组P / Invoke

时间:2013-07-26 02:27:06

标签: c# vb.net pinvoke

VS代码分析器抛出此警告:

  

CA2101为P / Invoke字符串参数指定编组要减少   安全风险,通过设置将编组参数'buffer'作为Unicode   DllImport.CharSet到CharSet.Unicode,或者通过显式封送   参数为UnmanagedType.LPWStr。如果你需要编组这个字符串   作为ANSI或系统相关,明确指定MarshalAs,并设置   BestFitMapping = FALSE;为了增加安全性,也设置了   ThrowOnUnmappableChar = TRUE。 Reg2Bat CenteredMSGBox.vb 20

下面:

<DllImport("user32.dll")> _
Shared Function GetClassName(hWnd As IntPtr, buffer As System.Text.StringBuilder, buflen As Integer) As Integer
End Function

我需要使用ANSI编码,但我不明白我需要做什么,所以我需要如何编组呢?

1 个答案:

答案 0 :(得分:9)

以下是pinvoke.net的声明。

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetClassName(
    IntPtr hWnd, 
    StringBuilder lpClassName,
    int nMaxCount
);

如果您(无论出于何种原因)想要导入ASCII版本,那么它看起来像

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
static extern int GetClassNameA(
    IntPtr hWnd, 
    StringBuilder lpClassName,
    int nMaxCount
);

另一种方法是为

中的各个参数指定编组行为
[DllImport("user32.dll", SetLastError = true)]
static extern int GetClassNameA(
    IntPtr hWnd, 
    [MarshalAs(UnmanagedType.LPStr)] StringBuilder lpClassName,
    int nMaxCount
);