-
-
[讨论]Delphi和VC中一个比较奇怪的回调函数问题
-
发表于:
2006-12-5 19:59
5452
-
[讨论]Delphi和VC中一个比较奇怪的回调函数问题
最近给一个delphi的程序插件。
因为对delphi不熟,就打算用vc来写。郁闷的是sdk只有delphi的。
其中遇到一个回调函数,郁闷坏了;
sdk中回调函数的原型
TCreateMenu = function(Window: IWindow; Parameters: PWideChar): IMenu; stdcall;
我看这个是stdcall应该很好转成vc的。
就定义了函数
IMenu* __stdcall myCreateMenu(IWindow* Window, BSTR Parameters)
{
....
}
把这个函数地址传给主程序,然后就崩溃了。
为了测试我用delphi建了一个简单的项目
定义函数如下
function myCreateMenu(Window: IWindow; Parameters: PWideChar): IMenu; stdcall;
begin
...
end;
然后拿这个测试,运行正常。
都是stdcall的函数,vc那个不正常,delphi的正常。
没办法,对delphi不熟,delphi函数编译后什么样子也不太清楚,
就拿od跟一跟,
发现一个奇怪的问题。
就是 vc的函数最后 ret 08 这个很好理解。
可是 delphi的那个函数最后 ret 0C ,这是怎么回事,明明只有两个参数?!
然后加了一些测试代码,发现 在delphi的函数里面,如果按照三个参数来理解
那么Window应该是第二个参数,Parameters是第三个参数.
于是我把 VC的那个函数改成三个参数,在最前面增加了一个参数。
编译测试,程序可以运行,不崩溃了,但是效果不对。
如是就有跟了一下delphi的那个函数,发现返回值放在第一个参数里面的。
如是再改
IMenu* __stdcall myCreateMenu(IMenu**ret, IWindow* Window, BSTR Parameters)
{
....
}
把返回值付给ret,编译运行正常了。
那位大大对delphi熟悉的,帮忙解解惑啊,delphi编译函数时会改变函数原型的?或者有什么规则?
(我用的是delphi7)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)