2016-08-21 3 views
-3

Так вот, что я пытаюсь сделать, я пытаюсь скопировать серийный номер в буфер обмена, но он не работает, есть что-то, что я сделал неправильно, если да, то PLZ помочь мне, я хотел бы, чтобы это работало, потому что это что-то для проект мне, что я продаюHwid to clipboard

#include "stdafx.h" 
#include <stdio.h> 
#include <iostream> 
#include <fstream> 
#include <string> 

#include "windows.h" 

namespace std {} 
using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    TCHAR volumeName[MAX_PATH + 1] = { 0 }; 

     TCHAR fileSystemName[MAX_PATH + 1] = { 0 }; 

     DWORD serialNumber = 0; 

     DWORD maxComponentLen = 0; 

     DWORD fileSystemFlags = 0; 

     if (GetVolumeInformation(

      _T("C:\\"), 

      volumeName, 

      ARRAYSIZE(volumeName), 

      & serialNumber, 

      & maxComponentLen, 

      & fileSystemFlags, 

      fileSystemName, 

      ARRAYSIZE(fileSystemName))) 

     { 



       _tprintf(_T("Serial Number: %lu\n"), serialNumber); 



       GlobalUnlock(GetVolumeInformation); 
       OpenClipboard(NULL); 
       EmptyClipboard(); 
       SetClipboardData(1, GetVolumeInformation); 
       CloseClipboard(); 
       MessageBoxA(NULL, "HWID COPYED.", "HWID", NULL); 
       std::cout << std::endl << "Press any key to continue..."; 
       getchar(); 
     } 

} 
+1

Правильный инструмент для решения таких проблем - использовать ваш отладчик, но не спрашивать в Stack Overflow, прежде чем вы это сделаете. Расскажите нам обо всех ваших наблюдениях, которые вы делали при проверке кода, проходящего по строкам на первом месте. Также вы можете прочитать ** [Как отладить небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** По крайней мере оставьте нас с [MCVE], который воспроизводит вашу проблему. (Это персональный комментарий к запасу от πάντα ῥεῖ ™). –

+0

- функция 'GetVolumeInformation'? почему вы передаете его в «SetClipboardData»? – elyashiv

+0

Потому что я хочу получить SerialNumber, и если я передам серийный номер в clipboardata, это даст ошибку, потому что это DWORD – Arix

ответ

0

Вы должны избегать использования T макросов (макросов начиная с _T и _t). Microsoft по-прежнему использует эти макросы в некоторых своих документах по историческим причинам, но это бесполезно и запутанно. Я не знаю, используете ли вы ANSI или Unicode (рекомендуется использовать Unicode).

Если вам нужен только серийный номер от GetVolumeInformation, вы можете установить другие переменные в NULL, см. Документацию.

После получения серийного номера преобразуйте его в текст. Затем скопируйте текст в буфер обмена. Ниже приведен пример ANSI:

void copy(const char* text) 
{ 
    int len = strlen(text) + 1; 
    HGLOBAL hmem = GlobalAlloc(GMEM_MOVEABLE, len); 
    char* buffer = (char*)GlobalLock(hmem); 
    strcpy_s(buffer, len, text); 
    GlobalUnlock(hmem); 

    OpenClipboard(NULL); 
    EmptyClipboard(); 
    SetClipboardData(CF_TEXT, hmem); 
    CloseClipboard(); 
} 

int _tmain() 
{ 
    DWORD serialNumber = 0; 
    if (GetVolumeInformation(
     _T("C:\\"), 
     NULL, 
     0, 
     &serialNumber, 
     NULL, 
     0, 
     NULL, 
     0)) 
    { 
     std::cout << serialNumber << std::endl; 
     char buf[100]; 
     sprintf_s(buf, 100, "%d", serialNumber); 
     copy(buf); 
     MessageBoxA(NULL, buf, "HWID", NULL); 
    } 
    return 0; 
} 
+0

ty men, которому вы мне помогли – Arix

+0

Нажмите галочку, чтобы принять ответ, если это ответили на ваш вопрос –