2012-12-20 39 views
7

Tôi đang cố gắng bật các điều khiển chung trong một ứng dụng. Tôi đã làm theo các bước được nêu trong this MSDN article, cụ thể là phần Using ComCtl32.dll Version 6 in an Application That Uses Only Standard Extensions. Nhưng tôi không thể làm cho nó hoạt động được.Cách bật các điều khiển chung trong ứng dụng Windows

Điều duy nhất tôi đang làm khác với bài viết là tôi thêm thông tin tệp kê khai trong Trang thuộc tính dự án | Thuộc tính cấu hình | Linker | Tệp kê khai | Phụ lục kê khai bổ sung. Đây là nội dung tôi nhập vào hộp văn bản:

"type = 'Win32' name = 'Microsoft.Windows.Common-Controls' version = '6.0.0.0' processorArchitecture = '*' publicKeyToken = '6595b64144ccf1df' language = '*' xmlns = 'http://schemas.microsoft.com/developer/msbuild/2003' ";% (AdditionalManifestDependencies)

Khi tôi kiểm tra tệp kê khai đã tạo (MyApp.exe.intermediate.manifest), có vẻ chính xác.

Tôi cũng thêm phụ thuộc liên kết vào ComCtl32.lib trong Thuộc tính dự án | Thuộc tính cấu hình | Linker | Đầu vào | Phụ thuộc bổ sung. Tôi cũng gọi InitCommonControlsEx lúc khởi động với cấu trúc INITCOMMONCONTROLSEX khởi tạo như thế này:

INITCOMMONCONTROLSEX icex; 
icex.dwSize = sizeof(INITCOMMONCONTROLSEX); 
icex.dwICC = ICC_STANDARD_CLASSES; 

Nhưng cuộc gọi đến InitCommonControlsEx luôn trả về FALSE (có nghĩa là nó đã thất bại). Sau khi điều tra, tôi phát hiện ra rằng mã lỗi được trả về từ GetLastError là ERROR_FILE_NOT_FOUND. Điều gì có thể là vấn đề?

CẬP NHẬT: Tôi nhận thấy điều gì đó có thể liên quan đến "lỗi không tìm thấy tệp". Khi tôi chạy ứng dụng từ trình gỡ lỗi, một trong những dòng trong cửa sổ Output là:

'MyApp.exe': Loaded 'C: \ Windows \ winsxs \ x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6002. 18305_none_88f3a38569c2c436 \ comctl32.dll', không thể tìm thấy hoặc mở các tập tin PDB

Tuy nhiên, có một loạt các dòng tương tự đối với một số các thư viện chuẩn giống như kernel32.lib, user32.lib, vv:

'MyApp.exe': Đã tải 'C: \ Windows \ System32 \ ntdll.dll', Không thể tìm hoặc mở PDB nộp

'MyApp.exe': Loaded 'C: \ Windows \ System32 \ kernel32.dll', không thể tìm thấy hoặc mở file PDB

'MyApp.exe': Loaded 'C: \ Windows \ System32 \ msvcrt.dll', không thể tìm thấy hoặc mở các tập tin PDB

'MyApp.exe': Loaded 'C: \ Windows \ System32 \ user32.dll', không thể tìm thấy hoặc mở PDB nộp

Những dòng này luôn xuất hiện cho bất kỳ ứng dụng nào và nó không gây ra vấn đề gì. Nó có thể khác với ComCtl32.dll không?

+0

Vì vậy, tôi sẽ đặt câu hỏi rõ ràng. Tính năng này có hoạt động * nếu không * thông tin tệp kê khai được thêm theo cách thủ công không? – WhozCraig

+0

@WhozCraig Đã thử, không hoạt động. – user1610015

+0

Bạn có cân nhắc việc gọi InitCommonControls() (không phải là Ex verson) làm dòng đầu tiên của WinMain hay không. Nó sẽ không hoạt động? Hay bạn đang cố gắng để có được một trong những phong cách hình ảnh mới hơn? – selbie

Trả lời

10

OK. Tôi đã làm một số bài tập về nhà này và phát hiện ra một cái gì đó mới bản thân mình. Làm thế nào tôi cuối cùng đã nhận này để làm việc là gần những gì bạn đang cố gắng để làm:

  1. Đến dự án/Properties/Linker/Manifest File/Dependencies Manifest bổ sung
  2. Nhập văn bản sau đây verbatim (nghĩa là tất cả các dấu trích dẫn đơn và đôi chính xác như dưới đây). Đây là tất cả trên một dòng, btw.

    "type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"

  3. Lưu các thiết lập của bạn một làm một dự án ĐẦY ĐỦ (nếu không nói là giải pháp) xây dựng lại để buộc tái sinh biểu hiện và PCH.

Trước khi làm điều này sau đây là trong tôi tải danh sách:

Loaded 'C: \ Windows \ winsxs \ x86_microsoft.windows.common-controls_6595b64144ccf1df_ 5.82.7601.17514 _none_ec83dffa859149af \ comctl32.dll'

Sau khi tay forcnig phiên bản manifest cho các điều khiển chung, danh sách tải hiện nay bao gồm này (và câu trả lời đúng TRUE để InitCommonControlsEx(), đó là quan điểm của tất cả điều này ở nơi đầu tiên):

Loaded 'C: \ Windows \ winsxs \ x86_microsoft.windows.common-controls_6595b64144ccf1df_ 6.0.7601.17514 _none_41e6975e2bd6f2b2 \ comctl32.dll'

Lưu ý: bạn cũng có thể thực hiện việc này bằng #pragma trong nguồn, lý tưởng trong tiêu đề stdafx.h của bạn, nhưng tôi thích nó theo cách này.

Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn, nó hoạt động ngay bây giờ! Vì vậy, điều duy nhất gây ra lỗi là thuộc tính "xmlns". Tôi thậm chí không biết làm thế nào mà thuộc tính đã có ở nơi đầu tiên như tôi chỉ cần sao chép và dán những gì đã được trên bài viết MSDN. Nó phải được thêm vào bởi VS trong khi tôi đã cố gắng để có được những dấu ngoặc kép đúng. – user1610015

8

Không, cảnh báo về các tệp PDB chỉ ở đó để cho bạn biết rằng bạn không có thông tin gỡ lỗi cho các DLL hệ thống Windows. Nhận được một trở lại FALSE từ InitializeCommonControlsEx() tất nhiên là vấn đề chính.

Có gì đó sai với chuỗi Phụ thuộc kê khai bổ sung mà bạn sử dụng.Tôi leng keng với nó một lúc nhưng không thể tìm thấy lỗ hổng. Việc xác định tùy chọn trình liên kết trong mã nguồn của bạn thường dễ dàng hơn. Mọi thứ hoạt động tốt khi tôi sử dụng:

#include <CommCtrl.h> 
#pragma comment(lib,"comctl32.lib") 
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 

Chỉ cần sao chép và dán đoạn mã trên vào một trong các tệp nguồn của bạn.

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