[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern uint GetWindowsDirectory(StringBuilder lpBuffer,
uint uSize);
<DllImport("kernel32.dll", SetLastError:=true, EntryPoint:="GetWindowsDirectoryW", CharSet:=CharSet.Unicode)> _
Public Function GetWindowsDirectory(<MarshalAs(UnmanagedType.LPTSTR)>lpBuffer As System.Text.StringBuilder, _
uSize As UInteger ) As UInteger
End function
Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" _
(ByVal Buffer As String, ByVal Size As Integer) As Integer
None.
Q. For the above VB DllImport declaration, Visual Studio's Code Analysis throws error 'CA2101: Specify marshaling for P/Invoke string arguments'.
Should the marshalling not be: <MarshalAs(UnmanagedType.LPWStr)> Otherwise lpBuffer will be converted to Ansi and then passed to a Unicode API method.
Please add some!
Here are two ways to get the Windows path
Private Sub test()
Dim sSystemPath As String = System.Environment.GetFolderPath(Environment.SpecialFolder.System)
MessageBox.Show(sSystemPath.Substring(0, sSystemPath.LastIndexOf("\")))
MessageBox.Show(System.Environment.GetEnvironmentVariable("windir"))
End Sub
As SDim WinDir tring = Space(255)
Dim Res As Integer = GetWindowsDirectory(WinDir, WinDir.Length)
WinDir = WinDir.Substring(0, Res)
Shared Function wins() As String
Dim sb As StringBuilder =new StringBuilder(100)
Dim f as UInteger = 100
GetWindowsDirectory(sb,i)
return sb.ToString()
End Function
const int MaxPathLength = 255;
StringBuilder sb = new StringBuilder(MaxPathLength);
int len = (int)GetWindowsDirectory(sb, MaxPathLength);
_windowsDirectory = sb.ToString(0, len);
static string wins()
{
StringBuilder sb =new StringBuilder(100);
int i = 100; uint f;
GetWindowsDirectory(sb,ref i);
return sb.ToString() ;
}
Environment.GetEnvironmentVariable("windir");