0

Windows のシリアル番号を取得する通常の方法は WMI です。

 ManagementObjectSearcher mos = new ManagementObjectSearcher("Select * From Win32_OperatingSystem");
 // ...
 // Select number from managementobject mo["SerialNumber"]

コンパクトなフレームワークが WMI をサポートしていないため、WMI を使用したくありません。アセンブリはデスクトップとコンパクト フレームワーク側で動作する必要があるため、参照を追加できません。

pinvoke 呼び出しを使用して同じ結果を得るにはどうすればよいですか?

4

2 に答える 2

1

WindowsCE の KernelIOControl を呼び出す必要があります。

これが C++ コードです。C# に変換する時間がありません。

#include <WINIOCTL.H> 
extern "C" __declspec(dllimport) 
BOOL KernelIoControl( DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned ); 
#define IOCTL_HAL_GET_DEVICEID CTL_CODE(FILE_DEVICE_HAL, 21, METHOD_BUFFERED, FILE_ANY_ACCESS) 

CString GetSerialNumberFromKernelIoControl() { 
    DWORD dwOutBytes; 
    const int nBuffSize = 4096; 
    byte arrOutBuff[nBuffSize]; 
    BOOL bRes = ::KernelIoControl(IOCTL_HAL_GET_DEVICEID, 0, 0, arrOutBuff, nBuffSize, &dwOutBytes); 
    if (bRes) { CString strDeviceInfo; for (unsigned int i = 0; i<dwOutBytes; i++) { 
        CString strNextChar; strNextChar.Format(TEXT("%02X"), arrOutBuff[i]); strDeviceInfo += strNextChar; 
    } 
    CString strDeviceId = strDeviceInfo.Mid(40,2) + strDeviceInfo.Mid(45,9) + strDeviceInfo.Mid(70,6); 
    return strDeviceId; 
    } else { 
        return _T(""); 
    } 
} 

編集: (pinvoke kernelIOControl c#)

[DllImport("coredll.dll")]
    public static extern bool KernelIoControl(long dwIoControlCode, IntPtr lpInBuff, long dwInBuffSize, IntPtr lpOutBuff, long dwOutBuffSize, IntPtr lpBytesReturned);
于 2009-02-02T10:20:38.113 に答える
0

まず、デスクトップとデバイスで機能する単一の呼び出しはありません。ただ起こらないでしょう。あなたができることは、次のような呼び出しでランタイム環境を決定することです。

if(Environment.OSVersion.Platform == PlatformID.WinCE) { ... }

これにより、デスクトップとデバイスを分離できます。

次に、デバイスの複雑さを追加する必要があります。そのためには、ターゲットハードウェアについて知る必要があります。Windows Mobile 5.0以降では、KernelIoControl呼び出しが保護される可能性が非常に高いため、GetDeviceUniqueIDを呼び出します。PocketPC2003以前では、KernelIoControl P / Invokeは妥当ですが、多くのデバイスが同じ結果を示すことが知られていますが、したがって、一意であるとは限りません。

一般的なWindowsCEデバイスの場合、それははるかに多様です。プラットフォームがIOCTL_HAL_GET_DEVICEIDを実装することを保証するものは何もないので、障害から保護し、他のメカニズムを見つける必要があります(多くの場合、OEMは独自のID APIを実装します)。CE 6.0の場合、KernelIoControlはアプリに対して非常に制限されており、OEMからのカーネルまたはドライバーラッパーAPIなしで呼び出すことができる可能性はほとんどありません。

于 2009-02-02T15:21:27.567 に答える