2009-09-14 38 views
13

Tôi cần xử lý một số tệp dll và exe trong một thư mục và xác định loại tệp tôi đang xử lý: .NET, COM, Win32 hoặc một số dạng sống ngoài hành tinh khác.Làm cách nào để phát hiện loại tệp dll? (COM, .NET, WIN32)

Tôi đã cố gắng để xác định cách dễ nhất để phát hiện các loại của một DLL, bạn nghĩ gì về điều này:

  1. COM dll => Tôi làm một LoadLibrary, sau đó GetProcAddress cho "DllRegisterServer". Nếu tôi nhận được trả lại hợp lệ, đó là tệp COM.

  2. NET dll => Nếu dll phụ thuộc vào mscoree.dll nó luôn luôn là một dll NET?

  3. Win32 dll => Nếu cả hai kiểm tra trên đều thất bại, đó là một dll Win32?

Chắc chắn phải có cách tốt hơn để phát hiện loại dll chúng ta đang xử lý. Ở trên là rất clunky, và sẽ không làm việc cho các tập tin EXE? Phải có một số cách khác mà tôi không nghĩ đến. Lý tưởng nhất là tôi muốn có thể làm cho trình phân tích cú pháp xác định trình biên dịch nào được biên dịch, và những tính năng nào nó sử dụng như MFC, Atl, Stl, v.v ... Nhưng tôi nghi ngờ điều đó có thể xảy ra ở phần trước thời đại phản chiếu?

Trả lời

1

Tôi không thấy một cách tốt hơn để làm việc đó. Tuy nhiên, ở 2., thực sự câu trả lời là không. Thời gian chạy chủ sẽ gần như chắc chắn cũng phụ thuộc vào mscoree.dll, và những người không nhất thiết phải hội đồng .Net.

.Dll dll có trình mô tả COM, bạn có thể tìm thấy bằng cách sử dụng dumpbin. Tôi không biết cách lấy thông tin này từ mã.

Nếu bạn đang lập trình trong .Net, một cách để xác định xem assembly có phải là một assembly .Net hay không bằng cách gọi Assembly.LoadFrom (...).

Vâng, đây không phải là câu trả lời thực sự, nhưng một tập hợp các mẹo về những điều tôi muốn xem xét.

+0

Xin chào, cảm ơn. Tôi đã sử dụng cách tiếp cận "cố gắng lắp ráp tải" trước đây - nhưng có vẻ như nó rất khó chịu? Có vẻ như tôi cần phải đi xuống tuyến đường PE. Có thể là một thành phần tái sử dụng tốt. Tôi đã hy vọng có một tính năng ẩn trong các thư viện để làm điều này, nhưng không đoán. –

+0

Vâng, nó có vẻ khủng khiếp clunky ... yyucckckk! :-) Chúc may mắn! –

4

DllRegisterServer là không bắt buộc, xuất chỉ cần cho một dll COM là DllGetClassObject

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