2008-12-04 44 views
13

Tôi có một ứng dụng Delphi tương tự như Taskbar Shuffle bao gồm một dll móc.Có thể truy cập dll 64 bit từ ứng dụng 32 bit không?

EDIT: Hook này DLL liên lạc với ứng dụng chính bằng cách gửi tin nhắn cửa sổ.

Tôi muốn thêm hỗ trợ cho XP và Vista x64 và ý tưởng ban đầu của tôi là chuyển đổi dll thành 64 bit (biên dịch với FreePascal) nhưng vẫn giữ ứng dụng 32 bit ngay bây giờ (Delphi).

Ứng dụng 32 bit có thể truy cập vào dll 64 bit không?

EDIT2: Tôi đang tải dll qua LoadLibrary vì vậy tôi đoán là tôi bị kẹt vì quá trình 32 bit sẽ không thể tải dll 64 bit, theo những gì tôi đọc trên liên kết chỉ bởi Lars Truijens trên một trong những câu trả lời dưới đây.

Trả lời

6

No. Bạn sẽ phải biên dịch hai phiên bản: 64 bit và 32 bit.

+0

Thậm chí nếu lệnh dll chỉ có nhiệm vụ là liên lạc với ứng dụng chính để gửi tin nhắn cửa sổ? – smartins

+0

Không, các dll 32bit được tải trong quá trình 64bit hoặc cách khác xung quanh. Nếu không phải vậy, thì không có vấn đề gì cả. –

+0

Câu trả lời sai.Điều này là có thể, nếu bạn tạo một quá trình nền 64 bit. :) –

2

Không, nhưng bạn có thể làm được điều đó bằng cách sử dụng COM. Nếu bạn chạy dll bên trong một đối tượng COM đang chạy như một quá trình độc lập, và giao tiếp với các giao diện marshallable (ví dụ: các giao diện tương thích tự động hóa), nó sẽ hoạt động. Nó không phải luôn luôn khả thi, tùy thuộc vào những gì dll hiện và làm thế nào mở rộng các hội nhập và các bề mặt cuộc gọi được, nhưng nó là một lựa chọn mà sẽ có thể làm cho rằng kịch bản có thể.

+0

Chỉ khi nó là một quá trình COM dịch vụ, giống như một EXE, DCOM hoặc COM +. Nếu không thì dll COM sẽ được nạp vào quá trình của bạn và phải được xây dựng cho cùng một nền tảng. –

9

Miễn là DLL 64 bit đang được tải bằng quy trình 64 bit riêng biệt và tất cả liên lạc giữa quy trình 32 bit và DLL 64 bit là thông qua cơ chế giống IPC ghép nối rời mà hệ điều hành có thể marshall , sau đó có bạn có thể làm điều đó.

Tôi đã làm điều tương tự. Ứng dụng 32 bit cần một trình bổ sung Bộ đệm in tùy chỉnh được triển khai trong một tệp DLL. Ứng dụng và trình bổ sung bộ đệm được truyền thông qua các cơ chế IPC (một cách ưa thích để nói các tệp tạm thời, trong trường hợp này).

Trên hệ thống 64 bit, mọi thứ về ứng dụng 32 bit hoạt động tốt ngoại trừ Bộ đệm in đã từ chối tải bổ trợ DLL, vì Bộ đệm in dĩ nhiên là quy trình 64 bit.

Giải pháp đơn giản như xây dựng lại chỉ bổ trợ Bộ đệm trong 64 bit. Không cần thay đổi toàn bộ ứng dụng 32 bit.

+0

Tôi đang tải dll thông qua LoadLibrary vì vậy tôi đoán tôi đang mắc kẹt kể từ một quá trình 32-bit sẽ không thể tải một dll 64-bit, theo những gì tôi đọc trên liên kết được chỉ bởi Lars Truijens. – smartins

6

Tôi vừa phát hiện ra giải pháp này, từ CodeCentral: http://cc.embarcadero.com/Author/802978

Nó cho phép để gọi bất kỳ thư viện 64 bit từ mã 32 bit. Đây là một giải pháp phức tạp, chạy 64 bit thực thi trên nền, sau đó giao tiếp với nó bằng cách sử dụng các tệp ánh xạ bộ nhớ và các cửa sổ thông điệp GDI để khởi chạy một số chức năng 64 bit từ một quá trình Delphi 32 bit.

Có mẫu có thể tải bất kỳ thư viện 64 bit nào, sau đó gọi bất kỳ chức năng nào của thư viện này, từ tệp thực thi 32 bit.

Dường như hoạt động tốt. Trong mọi trường hợp, mã là giá trị nhìn vào nó: đó là kỹ thuật, nhưng cũng được thiết kế!

+0

Bạn có chắc chắn có thể gọi thư viện * any * 64 bit từ mã 32 bit không? Thư viện 64 bit có thể trả về dữ liệu có thể không thể truy cập được từ quy trình 32 bit. –

+0

"Cầu nối" này xử lý nhiều loại dữ liệu: thanh ghi 64 bit, SIMD XMM và YMM, x87 và thậm chí cả thanh ghi AVX. Bộ nhớ đệm sẽ được xử lý thông qua tệp ánh xạ bộ nhớ. Dữ liệu được trả về 32 bit giống như được nhận từ thư viện 64 bit. Vì vậy, bạn có thể phải gọi sau phiên bản 64 bit của API nếu bạn muốn chơi với một xử lý được lấy từ 64 bit. Vì bạn có thể viết hàm 64 bit của riêng mình (nếu bạn biết một chút về asm), bạn có thể làm bất cứ điều gì bạn muốn với thư viện này, nếu cây cầu mặc định không đủ cho bạn. Nếu bạn biết bạn đang làm gì, bạn có thể gọi thư viện * any * 64 bit. –

+0

Để xử lý phức tạp hơn, bạn có thể viết một số wrapper sử dụng phiên bản 64 bit của FreePascal, sau đó gọi thư viện FPC này với cây cầu này từ ứng dụng Delphi 32 bit chính của bạn. –

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