2013-08-21 100 views
6

Tôi có một quá trình gọi CreateProcess. Có vẻ như CreateProcess trả về kết quả không thành công. Tuy nhiên, xử lý cho quá trình sau đó được thiết lập ngay lập tức, cho biết quá trình đã thoát. Khi tôi gọi GetExitCodeProcess, STATUS_DLL_NOT_FOUND sau đó được trả lại.CreateProcess STATUS_DLL_NOT_FOUND - dll nào?

Tôi hiểu rằng một DLL bị thiếu. Tôi thậm chí biết chính xác cái nào. Tuy nhiên, những gì tôi không hiểu là làm thế nào để con số đó ra lập trình.

Tôi nhận thấy rằng Windows sẽ trình bày một hộp thoại cho biết rằng quá trình không khởi động được vì nó không thể tìm thấy tệp DLL được chỉ định (ảnh chụp màn hình: http://www.mediafire.com/view/?kd9ddq0e2dlvlb9). Trong hộp thoại, Windows chỉ định tệp DLL nào bị thiếu. Tuy nhiên, tôi không tìm cách nào để có được thông tin đó một cách tự lập.

Nếu một quy trình không khởi động được và sẽ trả về STATUS_DLL_NOT_FOUND, làm cách nào để truy xuất theo chương trình tên thư viện mà quy trình đích được liên kết không tìm thấy? Bằng cách đó tôi có thể tự động ghi lại trong một báo cáo lỗi những gì DLL dường như bị thiếu hoặc bị hỏng trong một cài đặt nhất định.

+1

Tôi ước tôi biết câu trả lời. Phụ thuộc Walker làm điều đó, nhưng nó sử dụng API gỡ rối đòi hỏi một quá trình riêng biệt và nhảy nhiều vòng. (Bạn có thể tắt hộp thoại đó, BTW, ví dụ nếu quá trình của bạn chạy không cần giám sát và bạn muốn nó bị xóa sạch hơn là treo.) –

+2

có thể trùng lặp? http://stackoverflow.com/questions/597260/how-to-determine-a-windows-executables-dll-dependencies-programatically –

+1

Điều này không trả lời câu hỏi của bạn, nhưng bạn có thể sử dụng ['SetErrorMode()'] (http://msdn.microsoft.com/library/ms680621) để kiểm soát xem Windows có hiển thị hộp thoại thông báo lỗi khi DLL không tải được hay không; tuy nhiên, không có cách nào để truy cập dữ liệu sẽ được hiển thị trong hộp thoại báo lỗi. –

Trả lời

1

Cách rất khó là: Phân tích cú pháp tệp .EXE và .DLL và tạo cây phụ thuộc của tệp .DLL.

Tôi không nghĩ rằng có một cách để có được danh sách các tệp DLL bị thiếu: Khi Windows tìm thấy tệp DLL bị thiếu, nó dừng tải vì vậy nếu một tệp DLL bị thiếu, bạn sẽ không tìm ra nếu có thêm DLL tệp bị thiếu.

Một vấn đề khác bạn có thể có là các phiên bản DLL cũ có thể thiếu "xuất" (chức năng). Điều này thậm chí còn khó phát hiện hơn cây phụ thuộc.

+0

Trong khi điều này làm việc 99,9% thời gian, hãy lưu ý rằng điều này sẽ không tìm thấy dll được tải trong thời gian chạy với 'LoadLibrary'. –

+0

@MooingDuck: Điều này là chính xác; Tuy nhiên khi một DLL được gọi là lúc chạy CreateProcess() đã trở về thành công. –

2

Nếu dll được liên kết tĩnh, bạn có thể đi bộ và xem liệu dll có tồn tại hay không. Nếu dll được nạp tự động sau đó bắt đầu quá trình bị đình chỉ và hooking LoadLibrary (hoặc thay vì hooking thi đua một trình gỡ lỗi) là cách duy nhất tôi nhìn thấy.

4

Lợi nhuận tạo gia hạn 0 cho biết thành công.

CreateProcess() trả về BOOL, trong đó 0 là FALSE, còn gọi là thất bại không thành công.

Nếu một quy trình không khởi động được và sẽ trả về STATUS_DLL_NOT_FOUND, làm cách nào để truy xuất theo lập trình tên thư viện mà quy trình đích được liên kết không tìm thấy?

Thật không may, không có API cho điều đó. Tùy chọn duy nhất của bạn là truy cập và liệt kê bảng IMPORTS của thực thi để tìm ra những DLL mà nó sử dụng, và sau đó đệ quy truy cập và liệt kê các bảng IMPORTS của chúng, kiểm tra thủ công mọi tham chiếu DLL mà bạn tìm thấy. con đường hay không.

+0

Đã kiểm tra kỹ mã của tôi, bạn đã đúng. Tôi đã trích dẫn nó ra khỏi đỉnh đầu của tôi. CreateProcess() trả về nonzero cho thấy thành công. Yay phức tạp invocations và nếu báo cáo. Đó chắc chắn là GetExitCodeProcess() đang trở lại STATUS_DLL_NOT_FOUND. Cảm ơn bạn đã đứng đầu. Tôi sẽ phải để sếp của tôi biết tin xấu. – Keith4G