1

C で記述されたコードを C# (Compact Framework 2.0) に変換しようとしています (RFID リーダーを備えた Windows CE デバイス用です)。

C ではこのシステム コールは正常に機能しますが、C# では機能しません。

Cのコード

HANDLE m_Power =NULL; //<-- This HANDLE is set correctly before call "ControlDevice"
int ControlDevice(int device, BYTE power_state)
{
bool bRet;
    DWORD tcBuffer2,dwBytesReturned;
    unsigned int a = sizeof(power_state);
    bRet=DeviceIoControl(   m_Power, 
                device, 
                &power_state, 
                sizeof(power_state),  
                (PBYTE)&tcBuffer2, 
                sizeof(DWORD),
                &dwBytesReturned, 
                NULL);
    if(bRet)
        return 1;
    else
        return -1;
}

C# のコード

int ControlDevice(int device, byte[] power_state)
    {
        try
        {
            bool bRet = false;
            int bytesReturned = 0;
            byte[] tcBuffer2 = new byte[1];
            tcBuffer2[0] = 0;

            bRet = Device_WinApi.DeviceIoControlCE(m_Power,
                                    device,
                                    power_state,
                                    (int)Marshal.SizeOf(power_state),
                                    tcBuffer2,
                                    (int)Marshal.SizeOf(tcBuffer2),
                                    out bytesReturned,
                                    IntPtr.Zero);
            if (bRet)

                return 1;
            else
            {
                int LastError = Device_WinApi.GetLastError();
                return -1;
            }
        }
        catch (Exception e)
        {
            return -1;
        }
    }

DLL は次のようにインポートされます。

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("coredll.dll", EntryPoint = "DeviceIoControl", SetLastError = true)]
internal static extern bool DeviceIoControlCE(
                IntPtr hDevice,
                long dwIoControlCode, 
                byte[] lpInBuffer,
                int nInBufferSize,
                byte[] lpOutBuffer,
                int nOutBufferSize,
                out int lpBytesReturned,
                IntPtr lpOverlapped);

C# での現在の実装では、bRet = false であり、これは C で取得された値であるため、I は true である必要があります。

これもゼロを返します:

 int LastError = Device_WinApi.GetLastError()

どんな助けでも本当に感謝します!

よろしくお願いします!

4

0 に答える 0