使用Delphi DLL

时间:2012-03-07 17:29:23

标签: delphi

我在Delphi中有两个应用程序,我没有任何代码源:

我使用来自应用程序A的接口从应用程序B调用DLL文件。例如,我通常从接口A传递服务号200011以调用DLL文件B以获得值返回。但是,最近应用程序A改变了变量。我必须添加P00200011来调用DLL文件B.

我曾尝试创建DLL C#,但B中的DLL是使用fastcall约定创建的,我无法更改此DLL文件。

我还能采取其他方式吗?我没有想法。

2 个答案:

答案 0 :(得分:2)

您需要编写包装器DLL。使用要拦截的函数构建DLL,并在代码中加载并调用原始DLL。然后将包装器放在应用程序的同一目录中。来自应用程序的所有调用都将转到您的包装器DLL并从那里转到原始DLL。

这是一个简单的例子

你有这个图书馆(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

执行A,现在它将吐出2012年。

答案 1 :(得分:0)

我并不完全明白哪些部分属于你,什么称之为什么,但你应该能够在Delphi中创建自己的中间DLL,其中的接口使用fastcall并将调用转发给真正的DLL使用另一个调用约定。