Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Xin hướng dẫn lấy file từ resource ra void*

  1. #1
    Ngày gia nhập
    05 2010
    Bài viết
    350

    Mặc định Xin hướng dẫn lấy file từ resource ra void*

    Chào mọi người. Mình là dân ngoại đạo C++, nhưng có chút vấn đề nên phải dùng C++

    Mình muốn add file exe vào trong resource của project, lúc chạy thì lấy ra mảng byte
    Code:
    HRSRC hResource = FindResource(NULL, MAKEINTRESOURCE(resourceID), LPCWSTR("Binary"));
    resourceID là Tên file hoặc là IDR_Binary1(cái này hiển thị trong Resource View)

    hResource thì luôn trả về NULL. Mình đã google nhưng không ăn thua.
    Mình post nên đây để xin bác nào có kinh nghiệm thực tế chỉ giáo dùm.

    Thanks nhiều
    http://ghostdownload.net/ hỗ trợ download video từ youtube, facebook, bing, vimeo, zingmp3 v.v.v

  2. #2
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    867

    Bạn sử dụng hàm GetLastError ngay sau hàm trên để biết nguyên nhân gây ra lỗi. Theo tôi thì tới 90% là bạn thao tác tạo tài nguyên (kiểu, tên, ID) không đồng bộ với mã trên.

  3. #3
    Ngày gia nhập
    05 2010
    Bài viết
    350

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    Bạn sử dụng hàm GetLastError ngay sau hàm trên để biết nguyên nhân gây ra lỗi. Theo tôi thì tới 90% là bạn thao tác tạo tài nguyên (kiểu, tên, ID) không đồng bộ với mã trên.
    Cảm ơn Mod đã trả lời
    Mình nhận dc lỗi ERROR_RESOURCE_TYPE_NOT_FOUND. Khi mình thêm file mình đã để type là "Binary" Khi build file thì mình thấy file đã tăng kích thước, mình google nhiều mà áp dụng vô code đều không được. Mình không có xíu nào kinh nghiệm bên C++. Mong bạn chỉ dẫn rõ hơn. Cảm ơn bạn
    http://ghostdownload.net/ hỗ trợ download video từ youtube, facebook, bing, vimeo, zingmp3 v.v.v

  4. #4
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    867

    Trích dẫn Nguyên bản được gửi bởi tuandoi1 Xem bài viết
    Cảm ơn Mod đã trả lời
    Mình nhận dc lỗi ERROR_RESOURCE_TYPE_NOT_FOUND. Khi mình thêm file mình đã để type là "Binary" Khi build file thì mình thấy file đã tăng kích thước, mình google nhiều mà áp dụng vô code đều không được. Mình không có xíu nào kinh nghiệm bên C++. Mong bạn chỉ dẫn rõ hơn. Cảm ơn bạn
    Có lẽ là diễn giải bằng lời khó mà biết được bạn vướng ở chỗ nào, nên mình tạo ra vài cái exe để thử nghiệm, mình sẽ cố đi từng bước.

    Cho một bài toán : Viết chương trình mà khi thực thi, nó sẽ lấy tài nguyên từ bên trong chính nó (tài nguyên này là một exe khác) copy ra thư mục tạm trên máy và cho thực thi tập tin tạm này. Ở đây mình dùng các bản mẫu dự án là dự án trống, x86, biên dịch Release, VS2015.

    I. Viết một chương trình bất kỳ để làm tài nguyên : dự án ExeResource. Mình viết ExeResource.exe chỉ đơn giản hiển thị dòng chữ "From Resource !!!" ở giữa vùng Client. Mã nguồn
    Visual C++ Code:
    1. #include<Windows.h>
    2.  
    3. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
    4. {
    5.     switch (message)
    6.     {
    7.     case WM_PAINT:
    8.         HDC         hdc;
    9.         PAINTSTRUCT ps;
    10.         RECT        r;
    11.  
    12.         GetClientRect(hwnd, &r);
    13.         hdc = BeginPaint(hwnd, &ps);
    14.         SetBkMode(hdc, TRANSPARENT);
    15.         DrawText(hdc, TEXT("From Resource !!!"), -1, &r, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    16.         EndPaint(hwnd, &ps);
    17.         return 0;
    18.     case WM_DESTROY:
    19.         PostQuitMessage(0);
    20.         return 0;
    21.     }
    22.     return DefWindowProc(hwnd, message, wparam, lparam);
    23. }
    24. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
    25. {
    26.     WNDCLASS    w;
    27.     w.cbClsExtra = 0;
    28.     w.cbWndExtra = 0;
    29.     w.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
    30.     w.hCursor = LoadCursor(NULL, IDC_ARROW);
    31.     w.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    32.     w.hInstance = hInst;
    33.     w.lpfnWndProc = WndProc;
    34.     w.lpszClassName = TEXT("ExeResource");
    35.     w.lpszMenuName = NULL;
    36.     w.style = CS_HREDRAW | CS_VREDRAW;
    37.     if (!RegisterClass(&w))
    38.     {
    39.         MessageBox(NULL, TEXT("Error : RegisterClass()"), w.lpszClassName, MB_OK | MB_ICONEXCLAMATION);
    40.         return 0;
    41.     }
    42.  
    43.     HWND    hwnd = CreateWindow(w.lpszClassName, w.lpszClassName, WS_OVERLAPPEDWINDOW,
    44.         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL);
    45.     if (!hwnd)
    46.     {
    47.         MessageBox(NULL, TEXT("Error : CreateWindow()"), w.lpszClassName, MB_OK | MB_ICONEXCLAMATION);
    48.         return 0;
    49.     }
    50.     ShowWindow(hwnd, nShow);
    51.     UpdateWindow(hwnd);
    52.  
    53.     MSG     message;
    54.     while (GetMessage(&message, NULL, 0, 0))
    55.     {
    56.         TranslateMessage(&message);
    57.         DispatchMessage(&message);
    58.     }
    59.     return message.wParam;
    60. }

    II. Viết chương trình mà lấy ExeResource.exe làm tài nguyên : dự án ExeParent. Khi nhấn button, ExeParent.exe sẽ lấy tài nguyên từ bên trong và tạo thành tập tin temp.exe ở thư mục tạm rồi cho thực thi nó.

    1. Tạo dự án ExeParent từ bản mẫu dự án trống, copy chương trình ExeResource.exe vào thư mục dự án ExeParent. Nó sẽ nằm cùng với .h và .cpp của ExeParent sau này.
    2. Trong Solution Explorer : RightClick dự án ExeParent => Add => New Item...
    3. Trong hộp thoại Add New Item : Bung Visual C++ => Resource. Bên danh sách chọn Resource File (.rc). Nhấn Add.
    4. Trong Resource View : RightClick Resource.rc => Add Resource...
    5. Trong hộp thoại Add Resource : Nhấn Import...
    6. Trong hộp thoại Import : Ở hộp combo sát gần đáy chọn All File (*.*). Điều hướng trên ListView để tìm và chọn ExeResource.exe mà ta đã copy tới thư mục dự án ở bước (1). Xong nhấn Open.
    7. Trong hộp thoại Custom Resource Type : Nhập vào MYRESOURCE trên edit của combo, nhấn OK đóng hộp thoại.
    8. Tới đây chúng ta đã có kiểu tài nguyên "MYRESOURCE" và 1 tài nguyên của kiểu này là IDR_MYRESOURCE1 như hình dưới.
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		hinh1.jpg
Lần xem:	2
Size:		212.9 KB
ID:		65416

    Tiếp theo ta tạo tập tin .cpp giống như bước 2 ở trên chỉ khác là tạo tập tin mã nguồn và bắt đầu soạn thảo mã
    Visual C++ Code:
    1. #include<Windows.h>
    2. #include"resource.h"
    3.  
    4. void RunResourceAsExe(HWND hParent)
    5. {
    6.     // Chú ý định danh tài nguyên và tên kiểu
    7.     HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_MYRESOURCE1), TEXT("MYRESOURCE"));
    8.     if (!hRes)
    9.     {
    10.         MessageBox(hParent, TEXT("Error : FindResource()"), TEXT("ExeParent"), MB_OK | MB_ICONEXCLAMATION);
    11.         return;
    12.     }
    13.  
    14.     HGLOBAL hResLoad = LoadResource(NULL, hRes);
    15.     if (!hResLoad)
    16.     {
    17.         MessageBox(hParent, TEXT("Error : LoadResource()"), TEXT("ExeParent"), MB_OK | MB_ICONEXCLAMATION);
    18.         return;
    19.     }
    20.  
    21.     LPVOID lpResLock = LockResource(hResLoad);
    22.     if (!lpResLock)
    23.     {
    24.         MessageBox(hParent, TEXT("Error : LockResource()"), TEXT("ExeParent"), MB_OK | MB_ICONEXCLAMATION);
    25.         return;
    26.     }
    27.     // Ở đây nếu bạn muốn lấy ra mảng byte thì cấp phát động rồi copy từ lpResLock tới nó
    28.     // Nhớ đừng quên UnLockResource
    29.     //
    30.     DWORD   dwExeSize = SizeofResource(NULL, hRes); // Kích thước tài nguyên chính là kích thước exe ta sẽ tạo ra và thực thi
    31.     //
    32.     TCHAR   szPath[MAX_PATH * 2];
    33.     GetTempPath(MAX_PATH, szPath);
    34.     lstrcat(szPath, TEXT("\\Temp.exe"));
    35.  
    36.     HANDLE  hFile = CreateFile(szPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    37.     if (hFile == INVALID_HANDLE_VALUE)
    38.     {
    39.         UnlockResource(lpResLock);
    40.         MessageBox(hParent, TEXT("Error : CreateFile()"), TEXT("ExeParent"), MB_OK | MB_ICONEXCLAMATION);
    41.         return;
    42.     }
    43.     //
    44.     DWORD       dw;
    45.     BOOL        bSuccess = WriteFile(hFile, lpResLock, dwExeSize, &dw, NULL);
    46.     CloseHandle(hFile);                 // Đóng tập tin
    47.     UnlockResource(lpResLock);          // Mở khóa
    48.     if (!bSuccess || dw != dwExeSize)
    49.     {
    50.         DeleteFile(szPath);
    51.         MessageBox(hParent, TEXT("Error : WriteFile()"), TEXT("ExeParent"), MB_OK | MB_ICONEXCLAMATION);
    52.         return;
    53.     }
    54.     // Ở đây mình lấy cho đơn giản, muốn chắc chắn ta phải đưa thêm cặp dấu nháy bao szPath lại (dùng các hàm Shell)
    55.     // nếu đường dẫn của bạn có khoảng trống
    56.     ShellExecute(NULL, TEXT("open"), szPath, NULL, NULL, SW_SHOW);
    57. }
    58. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
    59. {
    60.     static  HWND        hButton;
    61.  
    62.     switch (message)
    63.     {
    64.     case WM_CREATE:
    65.         hButton = CreateWindow(TEXT("button"), TEXT("Run ExeResource"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
    66.             0, 0, 0, 0, hwnd, (HMENU)1500, ((LPCREATESTRUCT)lparam)->hInstance, NULL);
    67.         if (!hButton)
    68.             return -1;
    69.         return 0;
    70.     case WM_SIZE:
    71.         MoveWindow(hButton, LOWORD(lparam) / 2 - 80, HIWORD(lparam) / 2 - 15, 160, 30, TRUE);
    72.         return 0;
    73.     case WM_COMMAND:
    74.         switch (LOWORD(wparam))
    75.         {
    76.             // Button nhấn
    77.         case 1500:      // Hoặc đặt 1 #define ở đầu tập tin và thay nó vào lệnh CreateWindow và case này
    78.             RunResourceAsExe(hwnd);
    79.             return 0;
    80.         }
    81.         break;
    82.     case WM_DESTROY:
    83.         PostQuitMessage(0);
    84.         return 0;
    85.     }
    86.     return DefWindowProc(hwnd, message, wparam, lparam);
    87. }
    88. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
    89. {
    90.     WNDCLASS    w;
    91.     w.cbClsExtra = 0;
    92.     w.cbWndExtra = 0;
    93.     w.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
    94.     w.hCursor = LoadCursor(NULL, IDC_ARROW);
    95.     w.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    96.     w.hInstance = hInst;
    97.     w.lpfnWndProc = WndProc;
    98.     w.lpszClassName = TEXT("ExeParent");
    99.     w.lpszMenuName = NULL;
    100.     w.style = CS_HREDRAW | CS_VREDRAW;
    101.     if (!RegisterClass(&w))
    102.     {
    103.         MessageBox(NULL, TEXT("Error : RegisterClass()"), w.lpszClassName, MB_OK | MB_ICONEXCLAMATION);
    104.         return 0;
    105.     }
    106.  
    107.     HWND    hwnd = CreateWindow(w.lpszClassName, w.lpszClassName, WS_OVERLAPPEDWINDOW,
    108.         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL);
    109.     if (!hwnd)
    110.     {
    111.         MessageBox(NULL, TEXT("Error : CreateWindow()"), w.lpszClassName, MB_OK | MB_ICONEXCLAMATION);
    112.         return 0;
    113.     }
    114.     ShowWindow(hwnd, nShow);
    115.     UpdateWindow(hwnd);
    116.  
    117.     MSG     message;
    118.     while (GetMessage(&message, NULL, 0, 0))
    119.     {
    120.         TranslateMessage(&message);
    121.         DispatchMessage(&message);
    122.     }
    123.     return message.wParam;
    124. }

    Biên dịch và thực thi.

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		hinh2.jpg
Lần xem:	1
Size:		21.2 KB
ID:		65417
    Attached Files Attached Files

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn