C#アプリケーションのpinvoke経由でadvapi32.dllを使用して、サービスで使用する実行可能ファイルへのパスを取得しようとしています。私はUnicodeを指定していて、パスのように見える部分を取得していますが、文字の一部は明らかに翻訳にガーベージされています。PtrToStringUniが不正な文字を返すのはなぜですか?
private static string GetServicePath(IntPtr service)
{
SERVICE_CONFIG status = new SERVICE_CONFIG();
uint bytesNeeded = 1;
var queryResult = QueryServiceConfig(service, status, 0, out bytesNeeded);
if (queryResult == 0 && bytesNeeded == 0)
{
throw new ApplicationException("Failed to query service config.");
}
else
{
QueryServiceConfig(service, status, bytesNeeded, out bytesNeeded);
}
var servicePath = Marshal.PtrToStringUni(status.lpBinaryPathName);
return servicePath;
}
^方法は、したがって、たとえば、私はボンジュール」を求め期待
関連のPInvoke方法と構造^
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private class SERVICE_CONFIG
{
public int dwServiceType;
public ServiceStartType dwStartType;
public int dwErrorControl;
public IntPtr lpBinaryPathName;
public IntPtr lpLoadOrderGroup;
public int dwTagID;
public IntPtr lpDependencies;
public IntPtr lpServiceStartName;
public IntPtr lpDisplayName;
};
[DllImport("advapi32.dll", CharSet = CharSet.Unicode)]
private static extern int QueryServiceConfig(IntPtr hService, SERVICE_CONFIG queryConfig, UInt32 cbBufSize, out UInt32 pcbBytesNeeded);
サービスへのハンドルを使用してサービス名を取得するために呼び出されています返すパス
"C:\Program Files\Bonjour\mDNSResponder.exe"
代わりに私が変換しようとした場合、私は、Windows 10 XP
"C??
上
"C:\??? , m Files\Bonjour\mDNSResponder.exe"
この
"C:\??? , "C:\??? , "C:\??? , "C:\??? , "C:\
とちょうどこの上でこれを取得します表示名や開始名などの他のプロパティのいずれかを次に取得します正当な文字列。実行可能パスが他の文字列のやり方で解決されないのはなぜですか?
なぜあなたはIntPtr'代わりに、あなたもする必要はありませんSTRING' 'の'として文字列をマークしていますPtrToStringUniを呼び出しますか? – ckuri
@文字列をストリングにまっすぐ整列させても、まったく動作しませんでした。試してみるとCLRの例外があります。 – whyndsiv