2012-03-07 236 views
-1

我有在Delphi兩個應用程序針對我沒有任何代碼源:解決方法用Delphi DLL

我使用一個接口從應用程序A調用從應用B.實施例的DLL文件,我通常通過服務編號200011,從接口A調用DLL文件B進行值返回。但是,最近應用程序A已經改變了這個變量。我必須添加P00200011才能調用DLL文件B.

我試圖創建一個DLL C#,但B中的DLL是使用fastcall約定創建的,我無法更改此DLL文件。

我能做到的其他方法是什麼?我沒有想法。

+3

這個問題是相當難以理解。請儘量清楚你在問什麼。我想說的是'fastcall'是一個MSVC調用約定。你可能是指Delphi的'註冊'約定? – 2012-03-07 18:02:56

回答

0

對於我來說哪些部件是你的和什麼調用什麼並不完全清楚,但是你應該能夠在Delphi中用一個接口創建你自己的中間DLL,該接口使用fastcall並使用另一個調用將調用轉發給實際DLL慣例。

+0

我必須創建一個沒有Delphi的中間DLL我還可以使用什麼來創建中間DLL? – user1254829 2012-03-07 20:42:57

2

您需要編寫一個封裝器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

+1

您需要解決調用約定的問題。並且不需要導出。它什麼也沒做。 – 2012-03-07 18:37:45

+0

有沒有必要調用轉換,因爲包裝DLL也寫在德爾福。也需要導出,因爲包裝器DLL代替A.DLL並且必須具有與A.DLL相同的功能。但問題是包裝A.DLL不會解決問題!您應該改爲包裝B.DLL。 – 2012-03-07 20:37:14

+0

嗨,我可以做什麼,如果我不能使用Delphi來創建包裝DLL – user1254829 2012-03-07 20:40:09