Новичок
Профиль
Группа: Участник
Сообщений: 6
Регистрация: 22.11.2008
Репутация: нет Всего: нет
|
Все нет сил... а точнее знаний... В MS Visual Studio 2010 создал dll (проект ATL)... она должна реализовывать следующее: в неё передаем букву флешки а dll возвращает нам серийный номер... Но вот беда в коде который все это делает есть переменная buf2 - она типа WCHAR, а при создании dll выходной параметр можно указать только CHAR (WCHAR нет вообще)... ну и соответственно когда делаю *out_param = bu2; меня лакского посылает познаний в visual c++ хватило только на это... что делать хз? но dll очень надо!!! Код | // InformationKey.cpp: реализация CInformationKey #include "stdafx.h" #include "InformationKey.h" #define UNICODE #define _UNICODE #include <windows.h> #include <stdio.h> #include <conio.h> #include <locale.h> #include <WinIoCtl.h> // CInformationKey WCHAR* GetElem(WCHAR *ptr,WCHAR delim,WCHAR *buf) { WCHAR *ptr1=NULL; ptr1=wcschr(ptr,delim); if (ptr1) { wcsncpy(buf,ptr,(int)(ptr1-ptr)); buf[(int)(ptr1-ptr)]=0; return (ptr1+1); } else { wcscpy(buf,ptr); return NULL; } } STDMETHODIMP CInformationKey::GetInfoKey(CHAR* in_param, CHAR* out_param) { // TODO: добавьте код реализации HKEY hk=NULL; LONG Ret=0; HANDLE hdrive=INVALID_HANDLE_VALUE; DWORD data_size,dtype; WCHAR *data=NULL,*buf1=NULL,*buf2=NULL; WCHAR *ptr1_1=NULL,*ptr1_2=NULL,*ptr2_1=NULL,*ptr2_2=NULL; WCHAR dos_link[50]; WCHAR drive_name2[20]; __try { //проверяем существует ли диск в системе wsprintf(drive_name2,L"\\\\.\\%c:",*in_param); hdrive = CreateFileW(drive_name2,0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hdrive==INVALID_HANDLE_VALUE) { wprintf(L"Ошибка PrintFlashDriveInfo: Ошибка CreateFile: %u\n\n",GetLastError()); __leave; } CloseHandle(hdrive); Ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE,L"SYSTEM\\MountedDevices",0,KEY_READ,&hk); if (Ret!=ERROR_SUCCESS) { wprintf(L"Ошибка PrintFlashDriveInfo: Ошибка RegOpenKeyEx: %u\n\n",Ret); __leave; } wsprintf(dos_link,L"\\DosDevices\\%c:",*in_param); Ret=RegQueryValueExW(hk,dos_link,NULL,&dtype,NULL,&data_size); if (Ret==ERROR_SUCCESS) { data=(WCHAR *)malloc(data_size+2); buf1=(WCHAR *)malloc(data_size+2); buf2=(WCHAR *)malloc(data_size+2); if (data==NULL||buf1==NULL||buf2==NULL) { wprintf(L"Ошибка PrintFlashDriveInfo: Ошибка malloc.\n\n"); __leave; } memset(data,0,data_size+2); Ret=RegQueryValueExW(hk,dos_link,NULL,&dtype,(LPBYTE)data,&data_size); if (Ret!=ERROR_SUCCESS) { wprintf(L"Ошибка PrintFlashDriveInfo: Ошибка RegQueryValueEx: %u\n\n",Ret); __leave; } if(wcsstr(data,L"USBSTOR")!=NULL) { wprintf(L"Данные флеш-диска %c:\n",*in_param); ptr1_1=GetElem(data,L'#',buf1); if (ptr1_1) { ptr1_2=GetElem(ptr1_1,L'#',buf1); ptr1_1=buf1; do { ptr2_2=GetElem(ptr1_1,L'&',buf2); if (wcsstr(buf2,L"Ven_")) wprintf(L"Производитель: %s\n",buf2+4); else if (wcsstr(buf2,L"Prod_")) wprintf(L"Название продукта: %s\n",buf2+5); ptr1_1=ptr2_2; } while (ptr2_2); ptr1_1=GetElem(ptr1_2,L'#',buf1); ptr1_1=buf1; do { ptr2_2=GetElem(ptr1_1,L'&',buf2); if (wcslen(buf2)>3) { wprintf(L"Серийный номер: %s\n",buf2); *out_param = buf2; break; } ptr1_1=ptr2_2; } while (ptr2_2); } }//if USBSTOR else wprintf(L"Диск %c: НЕ является флешкой\n",*in_param); } else wprintf(L"Ошибка PrintFlashDriveInfo: Ошибка RegQueryValueEx: %u\n",Ret); wprintf(L"\n"); } __finally { if (data!=NULL) free(data); if (buf1!=NULL) free(buf1); if (buf2!=NULL) free(buf2); if (hk!=NULL) RegCloseKey(hk); } return S_OK; }
|
|