2015-02-01 6 views
0

사용자의 화면을 캡처하여 비트 맵에 저장하는 응용 프로그램에서 작업하고 있습니다. 파일C++ 비트 맵 파일 저장

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

유니 코드는 프로젝트에 정의되어 있습니다. 즉, 와이드 문자 버전의 Windows API를 사용하고있는 것입니다. LPC [W] STR은 C [Wide] 문자열에 대한 롱 포인터입니다.

유니 코드 정의를 제거하여 8 비트 ASCII 인터페이스를 사용하거나 더 나은 응용 프로그램에서 넓은 문자를 사용할 수 있습니다.

0

ATL (Active Template Library)을 사용하여 에서 LPCWSTR으로 file_name을 변환해야합니다.

따라서 <atlbase.h>에 정의

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

A2W (와이드에 ANSI)와

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

대체.