顯示具有 vc 標籤的文章。 顯示所有文章
顯示具有 vc 標籤的文章。 顯示所有文章

2011年3月31日 星期四

Open File Dialog on Windows API

最近在寫檔案操作的功能, 就是選擇一個檔案然後做複製或刪除的動作.
以下是選擇檔案的部份程式碼:
wchar_t fileName[256];
OPENFILENAME opf;

ZeroMemory(&opf, sizeof(opf));
opf.hwndOwner = 0;
opf.lpstrFilter = L"All Files(*.*)\0\*.*\0\0";
 //opf.lpstrFilter = L"JPG Files\0*.jpg\0BMP Files\0*.bmp\0PNG Files\0*.png\0\0";
opf.nFilterIndex = 1;
opf.lpstrFile = fileName;
opf.lpstrFile[0] = L'\0';
opf.nMaxFile = sizeof(fileName);
opf.lpstrFileTitle = 0;
opf.nMaxFileTitle = 0;
opf.lpstrInitialDir = L"C:\\";
opf.lpstrTitle = L"select file";
opf.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
opf.lStructSize = sizeof(opf);

if(GetOpenFileName(&opf)
{
  do something...
}
而複製檔案就使用 CopyFile(srcFile, dstFile, true), 刪除則是 DeleteFile(file).

MSDN有範例, 該頁面還有其他功能, 如選擇顏色等, 連結如下:
http://msdn.microsoft.com/en-us/library/ms646829

2011年3月14日 星期一

GetLastError in MSDN

以下網址即可找到錯誤訊息.
http://msdn.microsoft.com/en-us/library/ms681381

以下是 MSDN

void ErrorExit(LPTSTR lpszFunction)
{
    // Retrieve the system error message for the last-error code
    LPVOID lpMsgBuf;
    LPVOID lpDisplayBuf;
    DWORD dw = GetLastError();


    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );

    // Display the error message and exit the process
    lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
        (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR));
    StringCchPrintf((LPTSTR)lpDisplayBuf,
        LocalSize(lpDisplayBuf) / sizeof(TCHAR),
        TEXT("%s failed with error %d: %s"),
        lpszFunction, dw, lpMsgBuf);
    MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);

    LocalFree(lpMsgBuf);
    LocalFree(lpDisplayBuf);
    ExitProcess(dw);
}


void main()
{
    // Generate an error

    if(!GetProcessId(NULL))
        ErrorExit(TEXT("GetProcessId"));
}