Bạn có thể sử dụng chỉ thị lắp ráp vmtoffset
để lấy độ lệch byte của phương thức giao diện tương ứng với bắt đầu của bảng phương thức của giao diện. Hãy xem việc thực hiện _IntfCast
trong System.pas, ví dụ:
call dword ptr [eax] + vmtoffset IInterface.QueryInterface
...
call dword ptr [eax] + vmtoffset IInterface._Release
Khái niệm đầu tiên cho biết thêm 0; thứ hai, 8.
Tuy nhiên, bạn không thể tham số hóa các biểu thức đó. Chúng là hằng số biên dịch, vì vậy bạn không thể chọn phương thức nào bạn muốn trong thời gian chạy. Bạn cần phải có tất cả các tên phương thức có thể được biểu diễn trước.
Tất cả các bạn thực sự cần phải móc là QueryInterface
. Một khi bạn có điều đó, bạn có thể trả về bất kỳ đối tượng proxy nào bạn muốn có thể chặn cuộc gọi đến tất cả các phương thức khác.
Nguồn
2010-07-02 05:07:12
Delphi mất đi rất nhiều của tất cả các chi tiết COM đẫm máu, tôi nghĩ rằng bạn muốn làm quá nhiều cho mình. Bạn đang cố gắng đạt được điều gì? Tạo máy chủ COM của riêng bạn hoặc sử dụng máy chủ hiện tại của bạn? –
Bạn có muốn bù số của phương thức trong giao diện (ví dụ, IUnknown.QueryInterface là 0), địa chỉ của phương thức trong lớp thực hiện phương thức giao diện đó (ví dụ: @ TInterfacedObject.QueryInterface) hoặc địa chỉ của mã stub được tạo ra để liên kết một cuộc gọi giao diện đến phương thức đối tượng tương ứng? Cái sau được lưu trữ trong bảng giao diện của lớp. –
@The_Fox: Không: Tôi đang chặn cuộc gọi đến đối tượng COM bên ngoài bằng Win32Hook.pas. @Rob Kennedy: Không có lớp TInterfacedObject - tôi chỉ có giao diện được thực hiện bởi một dll bên ngoài. –