내 C# 응용 프로그램에서 pinvoke를 통해 advapi32.dll을 사용하여 서비스에서 사용하는 실행 파일의 경로를 가져 오려고합니다. 유니 코드를 지정하고 경로로 보이는 부분을 가져 오는 중이지만 일부 문자는 분명히 번역에 휘 말리기 시작했습니다.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;
}
방법은 서비스에 대한 핸들을 사용하여 서비스 이름을 얻기 위해 호출되는^
[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);
^PInvoke를 방법 및 구조가
그래서 예를 들어, 내가 봉쥬르 "에 대해 묻는 기대 관련 서비스 "경로를 반환
내가 변환 할 경우대신 나는
"C:\??? , "C:\??? , "C:\??? , "C:\??? , "C:\
그냥이 XP
"C??
의 Windows 8이 윈도우 10
"C:\??? , m Files\Bonjour\mDNSResponder.exe"
에이를 얻을 표시 이름 또는 시작 이름과 같은 다른 속성 중 하나를 선택하면 합법적 인 문자열. 실행 파일 경로가 다른 문자열과 같은 방식으로 해결되지 않는 이유는 무엇입니까?
을 대신 당신도 할 필요가 없습니다 것입니다 string''의 IntPtr''와 같은 문자열을 표시 한 이유는 PtrToStringUni를 호출 하시겠습니까? – ckuri
문자열을 곧장 마샬링하는 것은 전혀 효과가 없습니다. 시도했을 때 CLR 예외가 있습니다. – whyndsiv