我有在Delphi兩個應用程序針對我沒有任何代碼源:解決方法用Delphi DLL
我使用一個接口從應用程序A調用從應用B.實施例的DLL文件,我通常通過服務編號200011,從接口A調用DLL文件B進行值返回。但是,最近應用程序A已經改變了這個變量。我必須添加P00200011才能調用DLL文件B.
我試圖創建一個DLL C#,但B中的DLL是使用fastcall約定創建的,我無法更改此DLL文件。
我能做到的其他方法是什麼?我沒有想法。
我有在Delphi兩個應用程序針對我沒有任何代碼源:解決方法用Delphi DLL
我使用一個接口從應用程序A調用從應用B.實施例的DLL文件,我通常通過服務編號200011,從接口A調用DLL文件B進行值返回。但是,最近應用程序A已經改變了這個變量。我必須添加P00200011才能調用DLL文件B.
我試圖創建一個DLL C#,但B中的DLL是使用fastcall約定創建的,我無法更改此DLL文件。
我能做到的其他方法是什麼?我沒有想法。
對於我來說哪些部件是你的和什麼調用什麼並不完全清楚,但是你應該能夠在Delphi中用一個接口創建你自己的中間DLL,該接口使用fastcall並使用另一個調用將調用轉發給實際DLL慣例。
我必須創建一個沒有Delphi的中間DLL我還可以使用什麼來創建中間DLL? – user1254829 2012-03-07 20:42:57
您需要編寫一個封裝器DLL。您可以使用要攔截的函數來構建DLL,並且在代碼中只需加載並調用原始DLL即可。然後你將你的包裝放在你的應用程序的同一個目錄中。來自應用程序的所有調用將轉到您的包裝器DLL並從那裏轉移到原始DLL。
下面是一個簡單的例子
supose你有這個庫(B.DLL)
library B;
function B_FUNCTION(value:integer): integer; export;
begin
result:=value+1;
end;
exports B_FUNCTION;
end.
,並將該軟件使用它
program A;
{$apptype console}
function B_FUNCTION(value:integer): integer; external 'b.dll';
var i:integer;
begin
i:=B_FUNCTION(2010);
writeln(i);
end.
編譯這兩個程序並運行它們。打印的結果是2011年
現在,您的代碼包裝DLL
library w;
uses windows;
function B_FUNCTION(value:integer): integer; export;
var
adll: Thandle;
afunc: function(v:integer):integer;
begin
adll:=LoadLibrary('TRUE_B.DLL');
afunc:= GetProcAddress(adll,'B_FUNCTION');
result:=afunc(value+1);
FreeLibrary(adll);
end;
exports B_FUNCTION;
end.
構建它,你就會有A.EXE,B.DLL和W.DLL。取代他們
REN B.DLL TRUE_B.DLL
REN W.DLL B.DLL
執行,現在它會吐出2012
您需要解決調用約定的問題。並且不需要導出。它什麼也沒做。 – 2012-03-07 18:37:45
有沒有必要調用轉換,因爲包裝DLL也寫在德爾福。也需要導出,因爲包裝器DLL代替A.DLL並且必須具有與A.DLL相同的功能。但問題是包裝A.DLL不會解決問題!您應該改爲包裝B.DLL。 – 2012-03-07 20:37:14
嗨,我可以做什麼,如果我不能使用Delphi來創建包裝DLL – user1254829 2012-03-07 20:40:09
這個問題是相當難以理解。請儘量清楚你在問什麼。我想說的是'fastcall'是一個MSVC調用約定。你可能是指Delphi的'註冊'約定? – 2012-03-07 18:02:56