C# で setup.api を使用しています。SetupDiGetDriverInfoDetail 以外はすべて正常に動作します。プログラムがこの行を実行すると、例外メッセージがポップアップ表示されます
SetupDiGetDriverInfoDetail' がスタックのバランスを崩しました。これは、マネージド PInvoke 署名がアンマネージド ターゲット シグネチャと一致しないことが原因である可能性があります。PInvoke 署名の呼び出し規約とパラメーターがターゲットと一致していることを確認してください。
エラーは宣言署名が原因だと思います:
[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi)]
internal struct SP_DRVINFO_DETAIL_DATA
{
public Int32 cbSize;
public System.Runtime.InteropServices.ComTypes.FILETIME InfDate;
public Int32 CompatIDsOffset;
public Int32 CompatIDsLength;
public IntPtr Reserved;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public String SectionName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public String InfFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public String DrvDescription;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1)]
public String HardwareID;
};
[DllImport("setupapi.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
static extern uint SetupDiGetDriverInfoDetail(
IntPtr DeviceInfoSet,
SP_DEVINFO_DATA DeviceInfoData,
SP_DRVINFO_DATA DriverInfoData,
ref SP_DRVINFO_DETAIL_DATA DriverInfoDetailData,
Int32 DriverInfoDetailDataSize,
ref Int32 RequiredSize);
そして、これらのコードを次から使用します。
private string GetDrivInfoDetailHWID()
{
SP_DRVINFO_DETAIL_DATA driInfoDetailData = new SP_DRVINFO_DETAIL_DATA();
Int32 requiredSize = 0;
driInfoDetailData.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(SP_DRVINFO_DETAIL_DATA));
while(SetupDiGetDriverInfoDetail(_deviceHandle, _devInfoData, _driInfoData, ref driInfoDetailData, requiredSize, ref requiredSize)==0)
{
int e = Marshal.GetLastWin32Error();
}
return driInfoDetailData.HardwareID;
}
この問題を解決するのを手伝ってください。本当に感謝しています。