簡體   English   中英

獲取設備句柄時出錯

[英]Error getting device handle

我一直在嘗試與GPS接口卡的設備驅動程序接口。 我從供應商那里得到的示例是C ++。 我正在嘗試使用pinvoke在C#中工作

class HaveQuick
{
    [DllImport("setupapi.dll", CharSet = CharSet.Auto)]
    static extern IntPtr SetupDiGetClassDevs(
        ref Guid ClassGuid,
        IntPtr Enumerator,
        IntPtr hwndParent,
        uint Flags
        );

    [DllImport(@"setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern Boolean SetupDiEnumDeviceInterfaces(
       IntPtr hDevInfo,
       ref SP_DEVINFO_DATA devInfo,
       ref Guid interfaceClassGuid,
       UInt32 memberIndex,
       ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData
    );

        Guid GUID_DEVINTERFACE_IPHQT = new Guid(0x13ff045f, 0xe9d2, 0x479c, 0xb3, 0x90, 0x8c, 0xae, 0xc7, 0xd1, 0x1c, 0xc4);
        hDeviceInfo = SetupDiGetClassDevs(ref GUID_DEVINTERFACE_IPHQT, IntPtr.Zero, IntPtr.Zero, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
        if (hDeviceInfo == IntPtr.Zero)
        {
            lastError = Marshal.GetLastWin32Error();
            Console.WriteLine("**Error: couldn't get class info error code = {0}\n");
            return;
        }

             // Find the interface for device
        devNum = 0x0000;    
        SP_DEVICE_INTERFACE_DATA interfaceData = new SP_DEVICE_INTERFACE_DATA();                // Interface data for this device
        interfaceData.cbSize = (uint)Marshal.SizeOf(interfaceData);
        SP_DEVINFO_DATA deviceInfoData = new SP_DEVINFO_DATA();
        deviceInfoData.cbSize = (uint)Marshal.SizeOf(deviceInfoData);
        success = SetupDiEnumDeviceInterfaces(hDeviceInfo, ref deviceInfoData, ref GUID_DEVINTERFACE_IPHQT, devNum, ref interfaceData);
        if (!success)
        {
            lastError = Marshal.GetLastWin32Error();
            Console.WriteLine("**Error: couldn't enum device error number = {0}\n", lastError);

}

當我運行代碼時,我得到lasterror = 87,這是無效的參數

如果我用這行代碼替換成功= SetupDiEnumDeviceInterfaces(hDeviceInfo,IntPtr.Zero,ref GUID_DEVINTERFACE_IPHQT,devNum,ref interfaceData);

我得到lasterror = 1784 Invlid用戶緩沖區。

謝謝您的幫助

您的SetupDiGetClassDevs原型沒有SetLastError=true 因此,對Marshal.GetLastWin32Error的調用可能未獲得正確的值。 另外,除非調用返回的值無效,否則您不應檢查上一個錯誤。

GetLastError的文檔所述:

當函數的返回值指示此類調用將返回有用的數據時,應立即調用GetLastError函數。

因此,使用Marshal.GetLastWin32Error的模式應為:

IntPtr hDeviceInfo = SetupDiGetClassDevs( ... );
if (hDeviceInfo == IntPtr.Zero)
{
    // error here
    lastError = Marshal.GetLastWin32Error();
}

如果在沒有錯誤的情況下檢查最后一個錯誤,則不會告訴您將獲得什么值。 並非所有函數在成功時都調用值為0的SetLastError 因此,您可能從很久以前就收到了錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM