2012-02-11 26 views
13

Tôi có tài nguyên nhị phân tùy chỉnh (con trỏ hoạt hình) muốn lưu trữ dưới dạng tài nguyên trong một lib tĩnh trong Visual Studio C++. Nó chỉ ra rằng các tài nguyên nhị phân tùy chỉnh sẽ không được tải bởi :: LoadCursor() hoặc được tìm thấy bởi :: FindResource() nếu nó là một tài nguyên tùy chỉnh và trong một thư viện tĩnh.Làm thế nào để tải một tài nguyên nhị phân tùy chỉnh trong một thư viện tĩnh VC++ như là một phần của một dll?

This question cho một số công việc xung quanh.

Làm theo lời khuyên của nó, nếu tôi thêm tệp * .res vào exe dưới dạng "Thuộc tính cấu hình-> Trình liên kết-> Phụ thuộc bổ sung" thì thư viện tĩnh sẽ có thể tìm tài nguyên.

NHƯNG nếu thư viện tĩnh là một phần của dll và tôi liên kết nó dưới dạng Phụ thuộc bổ sung, không tìm thấy nó nữa!

Làm cách nào để liên kết tài nguyên trong một dll?

Hoặc chỉ làm cho nhị phân được tìm thấy trong lib tĩnh? Các phương pháp trong câu hỏi khá cồng kềnh.

+0

Không rõ liệu bạn có quên thêm tệp .res được yêu cầu trong dự án DLL hay không. Chế độ thất bại điển hình nhất là truyền tay sai mô-đun tới FindResource(). Nó phải được xử lý mô-đun của DLL. Bạn lấy nó từ DllMain(). Và có, dán này với nhau là cồng kềnh bởi thiết kế. –

Trả lời

29

Trong hộp thoại Thêm tài nguyên, bấm Nhập, chọn "Tất cả các tệp (.)" để cho phép bạn nhập tệp bất kỳ loại nào và sau đó chỉ cần chọn tệp bạn muốn ở đó. Khi hộp thoại Loại tài nguyên tùy chỉnh bật lên, hãy nhập RCDATA vào trường "Loại tài nguyên".

Nếu bạn mở rc tập tin, bạn sẽ thấy một cái gì đó như thế này:

///////////////////////////////////////////////////////////////////////////// 
// 
// RCDATA 
// 

IDR_RCDATA1   RCDATA    "myfile.whatever" 

và nó sẽ tạo ra resource.h với dòng sau:

#define IDR_RCDATA1     101 

Trong mã bạn truy cập vào nó như thế này :

#include "resource.h" 
#include <windows.h> 

int main(int argc, char* argv[]) 
{ 
    HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA); 
    HGLOBAL myResourceData = ::LoadResource(NULL, myResource); 
    void* pMyBinaryData = ::LockResource(myResourceData); 
    return 0; 
} 

nơi pMyBinaryData trỏ đến byte đầu tiên của tệp thi hành này. Để biết thêm thông tin ghé thăm Resource Functions

Dưới đây là một ví dụ làm thế nào bạn có thể tiết kiệm tài nguyên nhị phân như thế này trên đĩa:

#include "resource.h" 
#include <windows.h> 
#include <fstream> 

int main(int argc, char* argv[]) 
{ 
    HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA); 
    unsigned int myResourceSize = ::SizeofResource(NULL, myResource); 
    HGLOBAL myResourceData = ::LoadResource(NULL, myResource); 
    void* pMyBinaryData = ::LockResource(myResourceData); 

    std::ofstream f("C:\\x.bin", std::ios::out | std::ios::binary); 
    f.write((char*)pMyBinaryData, myResourceSize); 
    f.close(); 

    return 0; 
} 

Khi bạn xây dựng dự án với nguồn lực như vậy, khu vực này sẽ trở thành một phần của chương trình của bạn (dll).

+0

Và cũng đừng quên mở khóa tài nguyên: 'BOOL bResult = :: UnlockResource (hRes);' và 'bResult = :: FreeResource (hRes); ' – DitherSky

+11

@DitherSky: Không. Không cần thiết nữa, hãy kiểm tra tài liệu về [Chức năng FreeResource] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms648044 (v = vs.85) .aspx): * "Chức năng này đã lỗi thời và chỉ được hỗ trợ cho khả năng tương thích ngược với Windows 16 bit. Đối với các ứng dụng Windows 32 bit, không cần phải giải phóng tài nguyên được tải bằng LoadResource. "* – LihO

+0

' UnlockResource' chỉ là một macro không có trong SDK, tuy nhiên, 'FreeResource' có thật xuất khẩu no-op trên 'kernel32' cho backcomp. – wqw

Các vấn đề liên quan