Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > dll возвращающая серийный номер флешки


Автор: Naposaram 27.11.2014, 23:58
Все нет сил... а точнее знаний... В 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;
}

Автор: Zhunko 28.11.2014, 13:56
Это поможет: http://www.google.ru/url?q=http://msdn.microsoft.com/en-us/library/windows/desktop/dd319072(v%3Dvs.85).aspx&sa=U&ei=xVR4VPX7Gcqz7ga92IG4Bw&ved=0CBMQFjAA&usg=AFQjCNFVW7vMO7MObbV7BiDo26ObaQ1p0Q и http://www.google.ru/url?q=http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130(v%3Dvs.85).aspx&sa=U&ei=gVR4VIeuJuu57gb1yoH4Bw&ved=0CBMQFjAA&usg=AFQjCNHg9vvERRxDFFt3s4KhnCC1Np1hYg.

Автор: Dem_max 16.1.2015, 16:06
Цитата

а при создании dll выходной параметр можно указать только CHAR (WCHAR нет вообще)


не верю !!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)