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
Run Code Online (Sandbox Code Playgroud)
我需要使用ANSI编码,但我不明白我需要做什么,所以我需要如何编组呢?
这是pinvoke.net的声明.
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetClassName(
IntPtr hWnd,
StringBuilder lpClassName,
int nMaxCount
);
Run Code Online (Sandbox Code Playgroud)
如果您(无论出于何种原因)想要导入ASCII版本,那么它看起来就像
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
static extern int GetClassNameA(
IntPtr hWnd,
StringBuilder lpClassName,
int nMaxCount
);
Run Code Online (Sandbox Code Playgroud)
另一种方法是为各个参数指定编组行为,如
[DllImport("user32.dll", SetLastError = true)]
static extern int GetClassNameA(
IntPtr hWnd,
[MarshalAs(UnmanagedType.LPStr)] StringBuilder lpClassName,
int nMaxCount
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2646 次 |
| 最近记录: |