请问如何将VC做的动态库dll静态链接到Delphi程序(10分)

  • 主题发起人 主题发起人 ecc
  • 开始时间 开始时间
E

ecc

Unregistered / Unconfirmed
GUEST, unregistred user!
分不够可加,多谢各位了!
[:)]
 
RegDecrypt:procedure(len:integer;var s:pchar);stdcall;

aLib:THandle;
alib:=loadlibrary(PChar(GetEnvPath+'RegEnc.dll'));
if alib>=32 then
begin
@RegDecrypt:=GetProcAddress(aLib,'RegDecrypt');
RegDecrypt(len,temps);
FreeLibrary(aLib);
end;

 
我是指将vc的动态库在编译时就将需要的内容编译到
执行程序中。
在程序执行时不再需要vc的dll.
 
只有反汇编dll,在delphi中嵌入汇编
 
你要静态编译就不用这么麻烦,只要你知道函数的定义方式就行了
比如:你要调用的函数定义为:
function SomeFunction(a:integer;var b:double):boolean;
那你只要写一个unit
unit UseFunctiin;
interface
function SomeFunction(a:integer;var b:double):boolean
external 'DllName' stdcall;
implementation
end;
那么,在你的程序里uses UseFunctiin就可以向自己写的函数一样调用了。(函数的名字和
参数列表一定要一样,"stdcall"一般使用之个,关键看vc写的dll的函数是用那种方式,总共
有stdcall,pascal,c...(既不清了:),如果你向重命名这个函数,可是用下面的方式:
function SomeFunctionNewName(a:integer;var b:double):boolean
external'DllName' name SomeFunctionOldName;stdcall;
我有一段时间没有用过了,可能又记错的地方,你可以看看delphi的帮助,上面写得很全。[:)][red][/red]
 
对不起!我只得是静态。要是我没搞错的话,dcba
你的方法应当算动态调用。即程序运行时还需要
该vc库的存在!
还是那句话,如果大富翁还有高人的话,分可以随便加!!!!!
 
正规的方法不行
不正规的方法:用hellion的,反汇编,然后用basm编译成obj(可以在bcb下修改、编译,比较方便),
然后在delphi中调用,这个是静态连接
 
问题是这样的,所调用的
vc库也是我自己编的,但由于
是大量的底层算法计算,所以用c比较好,并且也应用到其他应用程序中。
目前我想用delphi制作自解程序,由于涉及到其他东西用delphi比较方便。
但总不能让用户使用自解程序是总带一个独立的动态链接库吧。
怪我没说清楚,对不起.[8D]
 
你把Dll作为资源编译到Exe就可以了,程序运行的时候Extract这个DLL,使用完成的时候,Delete这个DLL就可以了。
 
我想过这个问题,DLL的作用无非就是将内部函数放到内存中去,让别的程序来调用。
静态链接的主要难点在于如何将DLL中的过程绑定到Exe的地址空间中去(估计要用到类似
Aspack的功能——不过比它还要复杂!)。
还有一个问题,就是如何进行调试?——就算你已经成功的将DLL的过程映射到Exe的地址
空间中去了,你还是不可能让Delphi生成静态绑定DLL的Exe文件,因此,用到DLL中的过程的
代码是不可能被Delphi调试的(Turbo Debugger可以吗??)。
还有如何在绑定之后确定DLL过程的入口地址的问题——你不可能事先确定某个过程被映射
到哪个内存地址,因此不能在程序中写死,那么又如何让它自动定位呢??
 
你可以看一下有关.OBJ连入Delphi的信息。应该是这样吧。
C比较有效率,但Delphi也不差呀,混合语言编程不是一个最好的解决办法。
 
后退
顶部