2010-05-27 39 views
6

Tôi có một DLL gốc là một trình cắm thêm vào một ứng dụng khác (một trong đó tôi có cơ bản không kiểm soát). Mọi thứ chỉ hoạt động tốt cho đến khi tôi liên kết với một tệp .lib bổ sung (liên kết DLL của tôi với một DLL khác có tên là ABQSMABasCoreUtils.dll). Tệp này chứa một số API bổ sung từ ứng dụng mẹ mà tôi muốn sử dụng. Tôi thậm chí không viết bất kỳ mã nào để sử dụng bất kỳ chức năng nào được xuất khẩu nhưng chỉ liên kết trong tệp DLL mới này đang gây ra sự cố. Cụ thể, tôi nhận được lỗi sau khi tôi cố gắng chạy chương trình:Vấn đề nhập khẩu Win32 DLL (DllMain)

Ứng dụng không thể khởi chạy đúng (0xc0000025). Click vào ok để chấm dứt ứng dụng.

Tôi tin rằng tôi đã đọc ở đâu đó rằng điều này thường do hàm DllMain trả về FALSE. Ngoài ra, các thông báo sau đây được ghi vào đầu ra tiêu chuẩn:

LỖI: cấp phát bộ nhớ cố gắng trước khi thành phần khởi

Tôi gần như chắc chắn 100% thông báo lỗi này xuất phát từ việc áp dụng và không phải là một số loại Lỗi Windows.

Nhìn vào này nhiều hơn một chút (aka vùng vẫy xung quanh và lật mỗi chuyển tôi biết) tôi liên kết với/MAP bật và thấy điều này trong kết quả file .map:

0001:000af220  [email protected]@Z    00000001800b0220 f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll 
0001:000af226  [email protected][email protected]    00000001800b0226 f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll 
0001:000af22c  [email protected][email protected]   00000001800b022c f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll 
0001:000af232  [email protected]@Z    00000001800b0232 f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll 

Nếu tôi undecorate những tên sử dụng "undname" họ đưa ra như sau (cùng thứ tự):

void __cdecl operator delete(void * __ptr64) 
void * __ptr64 __cdecl operator new(unsigned __int64) 
void * __ptr64 __cdecl operator new[](unsigned __int64) 
void __cdecl operator delete[](void * __ptr64) 

tôi không chắc chắn tôi hiểu bất cứ điều gì từ ABQSMABasCoreUtils.dll có thể tồn tại trong tập tin .map này hoặc lý do tại sao DLL của tôi thậm chí còn cố gắng để tải ABQSMABasCoreUtils.dll nếu tôi không có bất kỳ mã nào tham chiếu es DLL này. Bất cứ ai có thể giúp tôi đặt thông tin này lại với nhau và tìm hiểu lý do tại sao điều này không hoạt động? Đối với những gì nó có giá trị tôi đã xác nhận thông qua "dumpbin" mà các ứng dụng mẹ nhập khẩu ABQSMABasCoreUtils.dll, do đó, nó đang được nạp không có vấn đề gì. Tôi cũng đã cố gắng trì hoãn tải DLL này trong DLL của tôi nhưng điều đó không thay đổi kết quả.

EDIT

Tôi đã hai lần kiểm tra và tất cả các file liên quan là 64 bit.

+1

Bạn đã thử sử dụng 'LoadLibrary' thay vì liên kết tĩnh của thư viện nhập? Nếu bạn làm điều này, ứng dụng chính của bạn đã được khởi tạo và bạn có một số lợi thế. – Oleg

+0

Tôi nghĩ về điều đó nhưng tôi sẽ kết thúc bằng cách sử dụng một số lượng lớn các chức năng từ thư viện này. Tôi sẽ không phải sử dụng GetProcAddress cho mỗi người? Tôi muốn tránh điều đó nếu có thể. – brady

+1

C0000025 = STATUS_NONCONTINUABLE_EXCEPTION. Hãy thử chạy ứng dụng trong windbg và xem nó bị treo ở đâu; có lẽ điều đó sẽ cho bạn một gợi ý. – Luke

Trả lời

5

Tôi vừa có cùng một vấn đề. Đây là một vấn đề với API Abaqus hơn là với tải DLLS.

Tôi nghĩ rằng đó là vì API Abaqus ghi đè các chức năng mới và xóa (như bạn dường như đã nhận thấy). Nếu bạn gọi mới hoặc xóa trong chương trình của bạn trước khởi API Abaqus, chẳng hạn như bằng cách gọi odb_initializeAPI(); sau đó bạn sẽ có được

LỖI: cấp phát bộ nhớ cố gắng trước khi khởi tạo thành phần

thông báo lỗi và bị treo chương trình .

Trong chương trình của tôi, gọi số odb_initializeAPI(); trước khi new đầu tiên giải quyết được sự cố.

+1

Đã một thời gian kể từ khi tôi sửa lỗi này nhưng tôi có một vấn đề khác. Tôi đã thực sự truy cập ODB trong một chương trình con người dùng vì vậy tôi đã sử dụng getActiveOdb(). Tôi đã nhận được lỗi này bởi vì tôi đã được biên dịch với một phụ thuộc vào msvcr90.dll và Abaqus đã được sử dụng msvcr80.dll. Nhưng tôi vui vì bạn đã đăng ở trên - thật khó để tìm kiếm trợ giúp nhanh trực tuyến cho các chương trình con của người dùng Abaqus và các bộ xử lý bài đăng. – brady

+0

@brady Bạn đã xác định và khắc phục vấn đề phụ thuộc như thế nào? Tôi tin rằng 'msvcr100.dll' là mâu thuẫn với' msvcr80.dll' trong chương trình của tôi. Tôi thực sự sẽ đánh giá cao một số trợ giúp với điều này. – Derek

+1

Tôi không nhớ làm thế nào tôi xác định nó - Tôi có thể sử dụng tiện ích "dumpbin/nhập khẩu" và nhận thấy các thư viện thời gian chạy C++ dự phòng. Để khắc phục vấn đề này, tôi đã phải xây dựng với Visual C++ 8.0 (Visual Studio 2005) là trình biên dịch C++ được hỗ trợ cho phiên bản Abaqus đó. Bạn có thể xem các trình biên dịch được hỗ trợ tại đây: [Abaqus System Requirements] (http://www.3ds.com/support/certified-hardware/simulia-system-information/). Chọn phiên bản thích hợp và nhấp vào Yêu cầu hệ thống, chọn nền tảng của bạn và tìm các yêu cầu của Trình biên dịch C++. – brady

0

ABQSMABasCoreUtils.dll có vẻ như đang nhập chức năng 64 bit. Là dll của bạn cũng 64-bit? Nếu không, thì đó là vấn đề - bạn không thể trộn các tệp DLL được biên dịch cho các kiến ​​trúc khác nhau trong cùng một quy trình.

+0

Nếu đúng như vậy, mã sẽ không biên dịch được - không bị lỗi khi chạy. –

2

Vâng, chắc chắn bạn sẽ tham chiếu việc nhập khẩu thư viện đó. Khó viết một chương trình C++ mà không sử dụng toán tử mới hoặc xóa. Đối phó với phần mềm của bên thứ ba nghĩ rằng nó cần phải ghi đè lên phiên bản CRT của những người vận hành đó là đủ khó, không thể khi nó không cho phép bạn gọi cho đến khi nó nghĩ rằng thời gian là đúng. Từ bỏ tất cả hy vọng hoặc tìm sự giúp đỡ từ nhà cung cấp.

+1

Có phải thông thường cho các chương trình C++ lớn để ghi đè các toán tử phổ biến như vậy không? Điều đó có vẻ khá ngớ ngẩn. Có thể làm việc này với/DEFAULTLIB không? – brady

+2

Nó chỉ phổ biến trong các chương trình ngớ ngẩn và các thư viện kiểu nền tảng dựa trên tất cả các mã được liên kết với chúng. Bạn không thể có được xung quanh nó. Hacking các .lib sẽ chỉ mang lại đau buồn khi một số mã sử dụng phân bổ và mã khác không. Đó là rò rỉ bộ nhớ tự động hoặc AV. –

1

Một trong những lý do có thể xảy ra lỗi khi tải ABQSMABasCoreUtils.dll là một số mô-đun phụ thuộc (không bao gồm DLL tải trễ) không thể tìm thấy. Sử dụng Phụ thuộc Walker (xem http://www.dependencywalker.com/) để kiểm tra tất cả các phụ thuộc của ABQSMABasCoreUtils.dll.

Tôi có hai gợi ý:

  1. Xác minh rằng bạn có thể tải ABQSMABasCoreUtils.dll đối với LoadLibrary với. Bạn không cần gọi bất kỳ hàm nào từ ABQSMABasCoreUtils.dll. Cách sử dụng của LoadLibrary Tôi không thấy là giải pháp cuối cùng. Nó chỉ là một thử nghiệm chẩn đoán. Với thử nghiệm, bạn có thể xác minh hoặc là bạn gặp phải một số vấn đề chung khi tải ABQSMABasCoreUtils.dll trong chương trình của bạn hoặc bạn có một số vấn đề khởi tạo quá trình.
  2. Nếu tải ABQSMABasCoreUtils.dll đối với LoadLibrary sẽ không thành công, sau đó sử dụng tính năng lược tả của Dependency Walker để thực hiện tất cả các cuộc gọi trong quá trình tải ABQSMABasCoreUtils.dll. Một cách khác là sử dụng Process Monitor (xem http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) để theo dõi tệp nào và các hoạt động đăng ký sẽ được thực hiện trong quá trình tải ABQSMABasCoreUtils.dll.

Nếu LoadLibrary không thất bại, thì bạn thực sự có vấn đề khởi tạo DLL. Thông thường vấn đề tồn tại nếu một DLL bên trong của DllMain thử sử dụng một hàm từ một DLL khác chưa được khởi tạo (chưa trả về từ DllMain). Trước khi bắt đầu một chẩn đoán của vấn đề này, chúng ta nên cố gắng loại trừ một vấn đề đơn giản hơn với LoadLibrary.

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