2015-02-01 5 views
0

Я работаю над приложением, которое захватывает экран пользователя и сохраняется в растровом изображении. У меня возникают проблемы при создании файлаC++ Save Bitmap file

HANDLE file = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ, 0, 
    CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 

Я получаю следующее сообщение об ошибке в имени файла: аргумент типа «LPCSTR» несовместима с параметром типа «LPCWSTR»

ниже код:

#include <olectl.h> 

bool saveBitmap(LPCSTR filename, HBITMAP bmp, HPALETTE pal) 
{ 
    bool result = false; 
    PICTDESC pd; 

    pd.cbSizeofstruct = sizeof(PICTDESC); 
    pd.picType = PICTYPE_BITMAP; 
    pd.bmp.hbitmap = bmp; 
    pd.bmp.hpal = pal; 

    LPPICTURE picture; 
    HRESULT res = OleCreatePictureIndirect(&pd, IID_IPicture, false, 
     reinterpret_cast<void**>(&picture)); 

    if (!SUCCEEDED(res)) 
     return false; 

    LPSTREAM stream; 
    res = CreateStreamOnHGlobal(0, true, &stream); 

    if (!SUCCEEDED(res)) 
    { 
     picture->Release(); 
     return false; 
    } 

    LONG bytes_streamed; 
    res = picture->SaveAsFile(stream, true, &bytes_streamed); 

    HANDLE file = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ, 0, 
     CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 

    if (!SUCCEEDED(res) || !file) 
    { 
     stream->Release(); 
     picture->Release(); 
     return false; 
    } 

    HGLOBAL mem = 0; 
    GetHGlobalFromStream(stream, &mem); 
    LPVOID data = GlobalLock(mem); 

    DWORD bytes_written; 

    result = !!WriteFile(file, data, bytes_streamed, &bytes_written, 0); 
    result &= (bytes_written == static_cast<DWORD>(bytes_streamed)); 

    GlobalUnlock(mem); 
    CloseHandle(file); 

    stream->Release(); 
    picture->Release(); 

    return result; 
} 

void CaptureScreen() 
{ 
    int nScreenWidth = GetSystemMetrics(SM_CXSCREEN); 
    int nScreenHeight = GetSystemMetrics(SM_CYSCREEN); 
    HWND hDesktopWnd = GetDesktopWindow(); 
    HDC hDesktopDC = GetDC(hDesktopWnd); 
    HDC hCaptureDC = CreateCompatibleDC(hDesktopDC); 
    HBITMAP hCaptureBitmap = CreateCompatibleBitmap(hDesktopDC, 
     nScreenWidth, nScreenHeight); 
    SelectObject(hCaptureDC, hCaptureBitmap); 
    BitBlt(hCaptureDC, 0, 0, nScreenWidth, nScreenHeight, 
     hDesktopDC, 0, 0, SRCCOPY | CAPTUREBLT); 

    LPCSTR fname = "c:\\Users\\hom3r\\Downloads\\image.bmp"; 
    HPALETTE hpal = NULL; 
    saveBitmap(fname, hCaptureBitmap, hpal); 

    ReleaseDC(hDesktopWnd, hDesktopDC); 
    DeleteDC(hCaptureDC); 
    DeleteObject(hCaptureBitmap); 
} 

ответ

0

вы UNICODE, определенный в проекте, а это означает, что вы используете версию широких символов в Windows API. LPC [W] STR - длинный указатель на C [Wide] String.

Вы можете либо удалить UNICODE define, чтобы использовать 8-разрядный интерфейс ASCII, либо лучше использовать широкие символы во всем приложении.

0

Вам необходимо преобразовать file_name из LPCSTR в LPCWSTR с использованием ATL (Active Template Library).

Следовательно, заменить

HANDLE file = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_READ, 0, 
     CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 

с

HANDLE file = CreateFile(A2W(filename), GENERIC_WRITE, FILE_SHARE_READ, 0, 
     CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 

A2W (ANSI на ширину) определяется в <atlbase.h>.