2

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 user buffer が表示されます。

助けてくれてありがとう

4

1 に答える 1

0

プロトタイプにはがありませSetupDiGetClassDevsSetLastError=true。したがって、への呼び出しMarshal.GetLastWin32Errorは正しい値を取得していない可能性があります。また、呼び出しから返された値が無効でない限り、最後のエラーをチェックしないでください。

GetLastErrorのドキュメントにあるように:

関数の戻り値がそのような呼び出しが有用なデータを返すことを示したら、すぐにGetLastError関数を呼び出す必要があります。

したがって、使用するパターンは次のMarshal.GetLastWin32Errorようになります。

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

エラーがなかったときに最後のエラーをチェックすると、どのような値が得られるかわかりません。すべての関数SetLastErrorが成功したときに値0で呼び出すわけではありません。そのため、ずっと前からエラーが発生している可能性があります。

于 2012-11-27T00:46:37.240 に答える