明显是API不对嘛,有你写的那个API么
如果是自己写的dll 。把里面想要别的程序调用的函数公开,具体你百度搜搜吧。。。
编译dll时注意下那个子程序有没设置公开。。
猜测下:这个是易写的内存皮肤dll吧
如果我的回答没能帮助您,请继续追问。
你看一下这个吧,希望对你有所帮助。导入表:1. kernel32.dll|
-->DeleteCriticalSection
...
-->GetStdHandle
2. user32.dll
|
-->GetKeyboardType
-->MessageBoxA
3. advapi32.dll
|
-->RegQueryValueExA
...
-->ReCloseKey
4. kernel32.dll
|
-->TlsSetValue
...
-->GetModuleHandleA
5. user32.dll
|
-->MessageBoxA
6. user32.dll
|
-->GetDesktopWindow
-->MessageBoxA
可以看到6部分的两个API函数正是我们刚才在工程的主单元中声明和调用的。也就是说2,5,6部分的User32.DLL分别是System,Windows,我们的工程(program HelloMsg)主单元中分别引入的。 字串9
进一步验证了我刚才的猜想--Delphi的把不同单元引入的DLL合API会分别引入到导入表中。
再进一步做一个实验
program HelloMsg
uses
Windows, System
procedure MessageBox(Wnd: IntegerText: PCharCaption: PCharTyp: Integer)stdcall
external 'user32.dll' name 'MessageBoxA'
procedure MessageBoxTest(Wnd: IntegerText: PCharCaption: PCharTyp: Integer)stdcall
external 'user32.dll' name 'MessageBoxA'
function GetDesktopWindow:HWNDstdcallexternal 'user32.dll' name 'GetDesktopWindow'
begin
Windows.MessageBox (0, 'Hello, Windows 98!', 'HelloMsg', 0)
MessageBox (0, 'Hello, Windows 98!', 'HelloMsg', 0)
MessageBoxTest (0, 'Hello, Windows 98!', 'HelloMsg', 0)
GetDesktopWindow
end.
注意MessageBox 和MessageBoxTest 分别引入的是User32中的同一个函数'MessageBoxA'。
编译后查看导如表。和上一次相同。也就是说在同一个单元中的重复声明的API会被合并。
至于为什么会这样猜测原因可能有两点:1是编译器在编译单元的时候已经确定哪些单元使用哪些函数。而没有进一步优化。2是有可能不同单元的引入外部函数的时候大概不能确定使用的DLL一定是同一个。 字串4
不管怎样的原因,通过上边的实验
得到如下结论:Delphi在编译的时候不同的单元出现的函数会被在导入表中分别出现两次。同一个单元内的重复函数会在导入表中被合并。
一. 建立公开函数:
二. 查看公开函数
可以使用pe查看修改类工具,以下用二种工具来演示:
1. Dependdency Walker(vs自带的工具)
2. LordPE
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)