kernel32.dllからこの関数(GetPackageId)をPInvokeしようとしています:http://msdn.microsoft.com/en-us/library/windows/desktop/hh446607(v = vs.85) .aspx
構造体とインポートを次のように定義しました。
[StructLayout(LayoutKind.Sequential)]
public struct PACKAGE_ID
{
uint reserved;
uint processorArchitecture;
PACKAGE_VERSION version;
String name;
String publisher;
String resourceId;
String publisherId;
}
[StructLayout(LayoutKind.Explicit)]
public struct PACKAGE_VERSION
{
[FieldOffset(0)] public UInt64 Version;
[FieldOffset(0)] public ushort Revision;
[FieldOffset(2)] public ushort Build;
[FieldOffset(4)] public ushort Minor;
[FieldOffset(6)] public ushort Major;
}
[DllImport("kernel32.dll", EntryPoint = "GetPackageId", SetLastError = true)]
static extern int GetPackageId(IntPtr hProcess,out uint bufferLength,out PACKAGE_ID pBuffer);
そしてそれをこのように呼びます:
PACKAGE_ID buffer = new PACKAGE_ID();
result = GetPackageId(hProcess, out bufferLength, out buffer);
ただし、戻り値は122(ERROR_INSUFFICIENT_BUFFER)になります。私はPInvokeにかなり慣れていないので、ここから先に進む方法がよくわかりません。関数を呼び出す前に文字列を初期化する必要がありますか?