我在Delphi中有两个应用程序,我没有任何代码源:
我使用来自应用程序A的接口从应用程序B调用DLL文件。例如,我通常从接口A传递服务号200011以调用DLL文件B以获得值返回。但是,最近应用程序A改变了变量。我必须添加P00200011来调用DLL文件B.
我曾尝试创建DLL C#,但B中的DLL是使用fastcall约定创建的,我无法更改此DLL文件。
我还能采取其他方式吗?我没有想法。
答案 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使用另一个调用约定。