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
[69029] Re:Re:CPU Serial 번호(어셈블리어)
LeeD [] 2047 읽음    2013-01-21 16:37
김도완님 감사합나디^^

제가 사이트에서 예제소스를 보고 작성해 보았는데요. 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 2254 2013/01/21
69028     Re:CPU Serial 번호(어셈블리어) 김도완 1808 2013/01/21
69029         Re:Re:CPU Serial 번호(어셈블리어) LeeD 2047 2013/01/21
69032             Re:Re:Re:CPU Serial 번호(어셈블리어) (자답 및 재질문) LeeD 1908 2013/01/21
69036                 Re:Re:Re:Re:CPU Serial 번호(어셈블리어) (자답 및 재질문) 김도완 2875 2013/01/22
69037                     Re:Re:Re:Re:Re:감사합니당^^(내용무) LeeD 2149 2013/01/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.