请哪位大侠帮忙用C#改写一下VC代码(环境Wince)unsigned char* GetStorageID(LPCTSTR szDisk)
{
BYTE *SerialNo ;
HANDLE hDisk = CreateFile(szDisk ,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE , NULL , OPEN_EXISTING , 0 , NULL);
PSTORAGE_IDENTIFICATION pStoreInfo = (PSTORAGE_IDENTIFICATION) new BYTE[3000];
DWORD dwBytesRet;
if(!DeviceIoControl(hDisk , IOCTL_DISK_GET_STORAGEID, NULL , 0 , pStoreInfo , 3000 , &dwBytesRet , NULL))
{
DWORD err = GetLastError();
delete [] pStoreInfo;
CloseHandle(hDisk);
return FALSE;
}
else
{
SerialNo = (((BYTE *)pStoreInfo) + pStoreInfo->dwManufactureIDOffset);  }
CloseHandle(hDisk);
return SerialNo;
}#define IOCTL_DISK_GET_STORAGEID CTL_CODE(FILE_DEVICE_DISK, 0x709,METHOD_BUFFERED,FILE_ANY_ACCESS)
typedef struct _STORAGE_IDENTIFICATION
{
DWORD dwSize;
DWORD dwFlags;
DWORD dwManufactureIDOffset;
DWORD dwSerialNumOffset;
} STORAGE_IDENTIFICATION, *PSTORAGE_IDENTIFICATION;

解决方案 »

  1.   

    太郁闷了。
    有要引入多个windowsapi,还要定义结构和常量,
    不愿意整
      

  2.   

    没调试这段代码,看大概意思,你是从wince的文件中读取一个类似SN号的东西吗
    你既然知道是要得到什么东西,可以直接用C#去实现这段代码,何必去改写。
    改写的时间,你都可以直接把上面代码封装成动态库去调用了
      

  3.   


    using System;public class GlobalMembers
    {
    public static byte GetStorageID(string szDisk)
    {
    byte SerialNo = 0;
    IntPtr hDisk = CreateFile(szDisk,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE, null, OPEN_EXISTING, 0, null);
    _STORAGE_IDENTIFICATION[] pStoreInfo = (_STORAGE_IDENTIFICATION)(new byte[3000]);
    uint dwBytesRet = 0;
    if (! (DeviceIoControl(hDisk, IOCTL_DISK_GET_STORAGEID, null, 0, pStoreInfo, 3000, dwBytesRet, null)))
    {
    uint err = GetLastError();
    pStoreInfo = null;
    CloseHandle(hDisk);
    return 0;
    }
    else
    {
    SerialNo = ((Convert.ToByte(pStoreInfo)) + pStoreInfo.dwManufactureIDOffset); }
    CloseHandle(hDisk);
    return SerialNo;
    }
    }#define IOCTL_DISK_GET_STORAGEID
    public class _STORAGE_IDENTIFICATION
    {
    public uint dwSize;
    public uint dwFlags;
    public uint dwManufactureIDOffset;
    public uint dwSerialNumOffset;
    }
      

  4.   

    太多不明确的地方,写一点给你,自己完成吧        [DllImport("kernel32.dll ", EntryPoint = "CreateFile ")]
            public static extern int CreateFile(
            string lpFileName,
            int dwDesiredAccess,
            int dwShareMode,
            IntPtr lpSecurityAttributes,
            int dwCreationDisposition,
            int dwFlagsAndAttributes,
            int hTemplateFile
            );        uint GENERIC_READ = (uint)0x80000000;
            uint GENERIC_WRITE = 0x40000000;
            int FILE_SHARE_READ = 0x00000001;
            int FILE_SHARE_WRITE = 0x00000002;
            int OPEN_EXISTING = 3;
    //CreateFile可以按下面用
    SafeHandle hDisk = CreateFile(szDisk, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, null, OPEN_EXISTING, 0, null);
      

  5.   


    兄弟,谢谢,API函数,我都知道。
      

  6.   

    这个 GetStorageID 函数,是用来获取SD卡序列号的,我是不知道函数下面几个地方不知道怎么改写PSTORAGE_IDENTIFICATION pStoreInfo = (PSTORAGE_IDENTIFICATION) new BYTE[3000];
        DWORD dwBytesRet;
        if(!DeviceIoControl(hDisk , IOCTL_DISK_GET_STORAGEID, NULL , 0 , pStoreInfo , 3000 , &dwBytesRet , NULL))
        {
            DWORD err = GetLastError();
            delete [] pStoreInfo;
            CloseHandle(hDisk);
            return FALSE;
            }
        else
        {
            SerialNo = (((BYTE *)pStoreInfo) + pStoreInfo->dwManufactureIDOffset);     }
        CloseHandle(hDisk);
        return SerialNo;另外这个API我是这样定义的,也不知道对不
    [DllImport("coredll.dll", EntryPoint = "DeviceIoControl", SetLastError = true)]
            internal static extern int DeviceIoControlCE(
                int hDevice,
                UInt64 dwIoControlCode,
                byte[] lpInBuffer,
                int nInBufferSize,
                byte[] lpOutBuffer,
                int nOutBufferSize,
                ref int lpBytesReturned,
                IntPtr lpOverlapped);