#include <comutil.h>
#include <assert.h>
//---------------------------------------------------------------------------
#pragma link "bcbatl.lib"
//---------------------------------------------------------------------------
void __stdcall _com_issue_error(long HRESULT) throw(_com_error)
{
//ATLASSERT(HRESULT);
assert(HRESULT); // 본래는 _com_error 객체를 던지는 에러처리를 해야 함.
}
//---------------------------------------------------------------------------
이렇게 추가하니까 에러는 사라졌네요ㅎ
그런데 첫번째 if문에서 바로 Error1이 뜨네요.
이것도 BIOS에서 시리얼 번호에 대한 기능이 꺼져있어서 그런건가요?
그렇다면 시리얼 번호에대한 기능을 enable하는 법좀 알려주세용
아니면 다른 문제가 있는건가요?ㅜ
그리고 그냥 첫번째 if문 주석걸고 실행해 보았더니 UniqueId 가 NULL값이 나오네요ㅜㅜ
LeeD 님이 쓰신 글 :
: 김도완님 감사합나디^^
:
: 제가 사이트에서 예제소스를 보고 작성해 보았는데요. ERROR가 나네요ㅜㅜ
:
: [ILINK32 Error] Error: Unresolved external '__stdcall _com_issue_error(long)' referenced from C:\USERS\CLONIX\DOCUMENTS\RAD STUDIO\PROJECTS\DEBUG\CPUID2CPP.OBJ
: [ILINK32 Error] Error: Unresolved external '__stdcall _com_util::ConvertStringToBSTR(const char *)' referenced from C:\USERS\CLONIX\DOCUMENTS\RAD STUDIO\PROJECTS\DEBUG\CPUID2CPP.OBJ
:
: 뭔가 잘못된 부분 있나요?ㅜㅜ
:
: 그리고 혹시 BIOS enable 시키는 법도 알려주시면 감사하겠습니다.ㅠ
:
: //---------------------------------------------------------------------------
:
: #include <vcl.h>
: #pragma hdrstop
:
: #include "CPUID2cpp.h"
:
: #define _WIN32_DCOM
: #include <iostream>
: #include <comdef.h>
: #include <Wbemidl.h>
:
: #pragma comment(lib, "wbemuuid.lib")
:
: using namespace std;
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
: #pragma resource "*.dfm"
: TMain *Main;
: //---------------------------------------------------------------------------
: __fastcall TMain::TMain(TComponent* Owner)
: : TForm(Owner)
: {
: }
: //---------------------------------------------------------------------------
: int GetCpuSerial()
: {
: HRESULT hres;
:
: hres = CoInitializeEx(0, COINIT_MULTITHREADED);
: if (FAILED(hres))
: {
: ShowMessage("Error1");
: return 1; // Program has failed.
: }
:
: hres = CoInitializeSecurity(
: NULL,
: -1, // COM authentication
: NULL, // Authentication services
: NULL, // Reserved
: RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication
: RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
: NULL, // Authentication info
: EOAC_NONE, // Additional capabilities
: NULL // Reserved
: );
:
:
: if (FAILED(hres))
: {
: CoUninitialize();
: ShowMessage("Error2");
: return 1; // Program has failed.
: }
:
: IWbemLocator *pLoc = NULL;
:
: hres = CoCreateInstance(
: CLSID_WbemLocator,
: 0,
: CLSCTX_INPROC_SERVER,
: IID_IWbemLocator, (LPVOID *) &pLoc);
:
: if (FAILED(hres))
: {
: CoUninitialize();
: ShowMessage("Error3");
: return 1; // Program has failed.
: }
:
: IWbemServices *pSvc = NULL;
:
: hres = pLoc->ConnectServer(
: _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
: NULL, // User name. NULL = current user
: NULL, // User password. NULL = current
: 0, // Locale. NULL indicates current
: NULL, // Security flags.
: 0, // Authority (for example, Kerberos)
: 0, // Context object
: &pSvc // pointer to IWbemServices proxy
: );
:
: if (FAILED(hres))
: {
: pLoc->Release();
: CoUninitialize();
: ShowMessage("Error4");
: return 1; // Program has failed.
: }
:
: Main->Memo1->Lines->Add("Connected to ROOT\\CIMV2 WMI namespace");
:
: hres = CoSetProxyBlanket(
: pSvc, // Indicates the proxy to set
: RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
: RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
: NULL, // Server principal name
: RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
: RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
: NULL, // client identity
: EOAC_NONE // proxy capabilities
: );
:
: if (FAILED(hres))
: {
: pSvc->Release();
: pLoc->Release();
: CoUninitialize();
: ShowMessage("Error5");
: return 1; // Program has failed.
: }
:
: IEnumWbemClassObject* pEnumerator = NULL;
: hres = pSvc->ExecQuery(
: bstr_t("WQL"),
: bstr_t("SELECT * FROM Win32_OperatingSystem"),
: WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
: NULL,
: &pEnumerator);
:
: if (FAILED(hres))
: {
: pSvc->Release();
: pLoc->Release();
: CoUninitialize();
: ShowMessage("Error6");
: return 1; // Program has failed.
: }
:
: IWbemClassObject *pclsObj;
: ULONG uReturn = 0;
:
: while (pEnumerator)
: {
: HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
: &pclsObj, &uReturn);
:
: if(0 == uReturn)
: {
: break;
: }
:
: VARIANT vtProp;
:
: // Get the value of the Name property
: hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
: // wcout << " OS Name : " << vtProp.bstrVal << endl;
: Main->Memo1->Lines->Add(" OS Name : " + (String)vtProp.bstrVal);
: VariantClear(&vtProp);
:
: pclsObj->Release();
: }
:
: pSvc->Release();
: pLoc->Release();
: pEnumerator->Release();
: pclsObj->Release();
: CoUninitialize();
:
: return 0;
: }
: void __fastcall TMain::Button1Click(TObject *Sender)
: {
: GetCpuSerial();
: }
: //---------------------------------------------------------------------------
:
: 김도완 님이 쓰신 글 :
: : 대부분 바이오스에서 시리얼 번호에 대한 기능이 꺼져있다고 합니다. 바이오스에서 enable시킨 후 테스트해보시고,
: :
: : 다른 방법으로 WMI를 이용하는 방법이 있습니다.
: :
: : 대충보니 UniqueID라는게 맞는 것 같네요.
: :
: :
http://msdn.microsoft.com/en-us/library/aa394373.aspx
: :
: : 참고하시길~
: :
: :
: : LeeD 님이 쓰신 글 :
: : : 안녕하세요.^^
: : :
: : : //---------------------------------------------------------------------------
: : : #include <vcl.h>
: : : #pragma hdrstop
: : :
: : : #include "Unit1.h"
: : : //---------------------------------------------------------------------------
: : : #pragma package(smart_init)
: : : #pragma resource "*.dfm"
: : : TMain *Main;
: : : //---------------------------------------------------------------------------
: : : __fastcall TMain::TMain(TComponent* Owner)
: : : : TForm(Owner)
: : : {
: : : }
: : : //---------------------------------------------------------------------------
: : : #pragma pack(push, 1)
: : : struct TCPUID
: : : {
: : : DWORD Version;
: : : DWORD Other;
: : : DWORD ExtendedFeatures;
: : : DWORD Features;
: : : };
: : : #pragma pack(pop)
: : :
: : : #pragma option push -w-
: : :
: : : void __fastcall CPU_ID(TCPUID* CpuID)
: : : {
: : : __asm
: : : {
: : : PUSH EBX
: : : PUSH EDI
: : : MOV EDI, EAX
: : : MOV EAX,1
: : : DW 0xA20F
: : : STOSD
: : : MOV EAX, EBX
: : : STOSD
: : : MOV EAX, ECX
: : : STOSD
: : : MOV EAX, EDX
: : : STOSD
: : : POP EDI
: : : POP EBX
: : : }
: : : }
: : :
: : : void __fastcall CPU_Serial(unsigned __int64* SerialNumber)
: : : {
: : : __asm
: : : {
: : : PUSH EBX
: : : PUSH EDI
: : : MOV EDI, EAX
: : : MOV EAX, 3
: : : DW 0xA20F
: : : MOV EAX, ECX
: : : STOSD
: : : MOV EAX, EDX
: : : STOSD
: : : POP EDI
: : : POP EBX
: : : }
: : : }
: : :
: : : bool IsCPUIDAvailable(void)
: : : {
: : : __asm
: : : {
: : : PUSHFD
: : : POP EAX
: : : MOV EDX, EAX
: : : XOR EAX, 0x00200000
: : : PUSH EAX
: : : POPFD
: : : PUSHFD
: : : POP EAX
: : : XOR EAX, EDX
: : : SHR EAX, 21
: : : }
: : : }
: : :
: : : bool GetCPUSerialNumber(unsigned __int64 *SerialNumber)
: : : {
: : : *SerialNumber = 0;
: : : if( IsCPUIDAvailable() )
: : : {
: : : TCPUID CpuID;
: : : memset(&CpuID, 0, sizeof(TCPUID));
: : : CPU_ID(&CpuID);
: : : if( CpuID.Features & 0x00040000 )
: : : {
: : : CPU_Serial(SerialNumber);
: : : return true;
: : : }
: : : }
: : : return false;
: : : }
: : :
: : : #pragma option pop
: : :
: : : void __fastcall TMain::Button1Click(TObject *Sender)
: : : {
: : : unsigned __int64 SerialNumber = 0;
: : : if( GetCPUSerialNumber(&SerialNumber))
: : : {
: : : ShowMessage(SerialNumber);
: : : }
: : : }
: : : //---------------------------------------------------------------------------
: : :
: : : 제가 CPU Serial번호를 가져오기 위하여 위와 같이 코딩하였는데요.
: : :
: : : GetCPUSerialNumber(&SerialNumber)의 리턴값이 false가 나오네요.ㅜ
: : :
: : : 저는 어디가 잘못되었는지 잘 모르겠어요ㅠㅠ
: : :
: : : 도움 주시면 감사하겠습니다.