C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[69032] Re:Re:Re:CPU Serial 번호(어셈블리어) (자답 및 재질문)
LeeD [] 1904 읽음    2013-01-21 19:58
#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가 나오네요.ㅜ
: : :
: : : 저는 어디가 잘못되었는지 잘 모르겠어요ㅠㅠ
: : :
: : : 도움 주시면 감사하겠습니다.

+ -

관련 글 리스트
69027 CPU Serial 번호(어셈블리어) LeeD 2251 2013/01/21
69028     Re:CPU Serial 번호(어셈블리어) 김도완 1803 2013/01/21
69029         Re:Re:CPU Serial 번호(어셈블리어) LeeD 2044 2013/01/21
69032             Re:Re:Re:CPU Serial 번호(어셈블리어) (자답 및 재질문) LeeD 1904 2013/01/21
69036                 Re:Re:Re:Re:CPU Serial 번호(어셈블리어) (자답 및 재질문) 김도완 2874 2013/01/22
69037                     Re:Re:Re:Re:Re:감사합니당^^(내용무) LeeD 2145 2013/01/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.