question

DanielSedory-5985 avatar image
0 Votes"
DanielSedory-5985 asked ·

Cannot run Microsoft Device I/O C++ example code without C2664 Error

I'm trying to run the C++ Device I/O Control code example at:

https://docs.microsoft.com/en-us/windows/win32/devio/calling-deviceiocontrol

in Visual Studio 2019 Community; using Debug x86 (32-bit, Console or Windows... same error for either), and it points out that the error C2664 is due to: "...cannot convert argument 1 from 'const wchar_t [19]' to 'LPWSTR' " and the IDE notes point out that on LINE 51 (see below), the argument of type "wchar_t*" [at LINE 45] is incompatible with parameter of type "LPWSTR"; which only occurs at LINE 13.

I'm sure it's an easy fix for most of you! Here's the code exactly from that web page:

 #define UNICODE 1
 #define _UNICODE 1
    
 /* The code of interest is in the subroutine GetDriveGeometry. The
    code in main shows how to interpret the results of the call. */
    
 #include <windows.h>
 #include <winioctl.h>
 #include <stdio.h>
    
 #define wszDrive L"\\\\.\\PhysicalDrive0"
    
 BOOL GetDriveGeometry(LPWSTR wszPath, DISK_GEOMETRY* pdg)
 {
     HANDLE hDevice = INVALID_HANDLE_VALUE;  // handle to the drive to be examined 
     BOOL bResult = FALSE;                   // results flag
     DWORD junk = 0;                         // discard results
    
     hDevice = CreateFileW(wszPath,   // drive to open
         0,                           // no access to the drive
         FILE_SHARE_READ |            // share mode
         FILE_SHARE_WRITE,
         NULL,              // default security attributes
         OPEN_EXISTING,     // disposition
         0,                 // file attributes
         NULL);             // do not copy file attributes
    
     if (hDevice == INVALID_HANDLE_VALUE)    // cannot open the drive
     {
         return (FALSE);
     }
    
     bResult = DeviceIoControl(hDevice,  // device to be queried
         IOCTL_DISK_GET_DRIVE_GEOMETRY,  // operation to perform
         NULL, 0,                        // no input buffer
         pdg, sizeof(*pdg),              // output buffer
         &junk,                          // # bytes returned
         (LPOVERLAPPED)NULL);            // synchronous I/O
    
     CloseHandle(hDevice);
    
     return (bResult);
 }
    
 int wmain(int argc, wchar_t* argv[])
 {
     DISK_GEOMETRY pdg = { 0 }; // disk drive geometry structure
     BOOL bResult = FALSE;      // generic results flag
     ULONGLONG DiskSize = 0;    // size of the drive, in bytes
    
     bResult = GetDriveGeometry(wszDrive, &pdg);
    
     if (bResult)
     {
         wprintf(L"Drive path      = %ws\n", wszDrive);
         wprintf(L"Cylinders       = %I64d\n", pdg.Cylinders);
         wprintf(L"Tracks/cylinder = %ld\n", (ULONG)pdg.TracksPerCylinder);
         wprintf(L"Sectors/track   = %ld\n", (ULONG)pdg.SectorsPerTrack);
         wprintf(L"Bytes/sector    = %ld\n", (ULONG)pdg.BytesPerSector);
    
         DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
             (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
         wprintf(L"Disk size       = %I64d (Bytes)\n"
             L"                = %.2f (Gb)\n",
             DiskSize, (double)DiskSize / (1024 * 1024 * 1024));
     }
     else
     {
         wprintf(L"GetDriveGeometry failed. Error %ld.\n", GetLastError());
     }
    
     return ((int)bResult);
 }


c++winapi-sdk
10 |1000 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

1 Answer

Viorel-1 avatar image
0 Votes"
Viorel-1 answered ·

Try this fix:

 BOOL GetDriveGeometry( LPCWSTR wszPath, DISK_GEOMETRY* pdg )
· 1 ·
10 |1000 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

Thank you Viorel-1,
If I had been programming for Windows in C or C++ I'm sure I would have seen that simple error! Now I can move on in my learning path. Oh, for any beginners:
The answer was simply changing "LPWSTR" on LINE 13 to: LPCWSTR.


Dan.



0 Votes 0 ·