김도완님 감사합나디^^
제가 사이트에서 예제소스를 보고 작성해 보았는데요. 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가 나오네요.ㅜ
: :
: : 저는 어디가 잘못되었는지 잘 모르겠어요ㅠㅠ
: :
: : 도움 주시면 감사하겠습니다.