请熟悉Delphi和VC的大虾帮忙看下

lengx7 2009-03-11 01:56:07
WNDENUMPROC	R_EnumProc	= NULL;

BOOL WINAPI MyEnumFunc(HWND hWnd, LPARAM lParam)
{
return R_EnumProc(hWnd, lParam);
}
BOOL WINAPI MyEnumWindows(WNDENUMPROC tsEnumFunc, LPARAM lParam)
{...}


以上这段VC的代码,怎么转换为Delphi的呢?主要是return 那里,VC的返回类型不一样也可以?
Delphi7带的源代码里有这么一句
function EnumWindows(lpEnumFunc: TFNWndEnumProc; lParam: LPARAM): BOOL; stdcall;

WNDENUMPROC 应该= TFNWndEnumProc 吧……
...全文
109 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Seamour 2009-03-13
  • 打赏
  • 举报
回复
不就一个陷阱式api么,至于搞这么乱么
找个好点儿的delphi版本写的吧
lengx7 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 neweipeng 的回复:]
引用 3 楼 lengx7 的回复:
R_EnumProc : TFNWndEnumProc = nil;  //声明为全局变量,这写代码是写在一个无窗口的DLL内
function MyEnumFunc(hWnd: LongWord; lParam: LPARAM): BOOL; stdcall;
begin
result :=R_EnumProcc(hWnd,lParam);        //编译器在这里提示:[错误] : Missing operator or semicolon
end;


Delphi的windows.pas中有TFNWndEnumProc = Pointer;
也就是说R_EnumProc只是一个无类型指针,而不是函数…
[/Quote]

使用3楼的代码,编译成功!
但是在运行的时候出现了一些问题
function MyEnumFunc(hWnd: LongWord; lParam: LPARAM): BOOL; stdcall;
var
func: FNWndEnumProc;
begin
@func := R_EnumProc; //如果MyEnumFunc里只有这一句代码,程序会占用CPU100%,自身卡死
result := func(hWnd,lParam); //执行到这里会提示:stack overflow。程序退出
end;

function NewEnumWindows(lpEnumFunc: TFNWndEnumProc; lParam: LongWord): BOOL; stdcall; //Hook EnumWindows
var
Retu:Boolean;
begin
R_EnumProcc := lpEnumFunc;
//Retut := EnumWindows((TFNWndEnumProc)MyEnumFun, lParam); //原VC版本的
Retu := EnumWindows(@MyEnumFun, lParam);
result := Retu;
end;


ljluck7687 2009-03-11
  • 打赏
  • 举报
回复
function EnumWindows(lpEnumFunc: TFNWndEnumProc; lParam: LPARAM): BOOL; stdcall;
...

function MyEnumFunc(hWnd: LongWord; lParam: LPARAM): BOOL; stdcall;
begin
result :=EnumWindows(hWnd,lParam); //返回值是函数的返回结果
end;
yc_8301 2009-03-11
  • 打赏
  • 举报
回复
其实就是枚举窗体,这也是网上的例子,如下:

function EnumWindowsProc(hwnd: HWND;lParam: DWORD): boolean; stdcall;
var
szCaption: array[0..256] of Char;
begin
GetWindowText(hwnd,szCaption,127);
if length(szCaption)>0 then
begin
showmessage(szCaption); //这里是窗体名枚举 想判断某个窗体在这里写就成
end;
result:= TRUE;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
EnumWindows(@EnumWindowsProc, 0);
end;

neweipeng 2009-03-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lengx7 的回复:]
R_EnumProc : TFNWndEnumProc = nil; //声明为全局变量,这写代码是写在一个无窗口的DLL内
function MyEnumFunc(hWnd: LongWord; lParam: LPARAM): BOOL; stdcall;
begin
result :=R_EnumProcc(hWnd,lParam); //编译器在这里提示:[错误] : Missing operator or semicolon
end;
[/Quote]

Delphi的windows.pas中有TFNWndEnumProc = Pointer;
也就是说R_EnumProc只是一个无类型指针,而不是函数,当然不能直接传递参数了
你可以定义:

type
FNWndEnumProc = function(hWnd: LongWord; lParam: LPARAM): BOOL; stdcall;

var
R_EnumProc: TFNWndEnumProc = nil;

function MyEnumFunc(hWnd: LongWord; lParam: LPARAM): BOOL; stdcall;
var
func: FNWndEnumProc;
begin
@func := R_EnumProc;
result := func(hWnd,lParam);
end;
lengx7 2009-03-11
  • 打赏
  • 举报
回复
WNDENUMPROC    R_EnumProc    = NULL;

BOOL WINAPI MyEnumFunc(HWND hWnd, LPARAM lParam)
{
return R_EnumProc(hWnd, lParam);
}


我将这段代码改成Delphi的,如下:

R_EnumProc : TFNWndEnumProc = nil;  //声明为全局变量,这写代码是写在一个无窗口的DLL内
function MyEnumFunc(hWnd: LongWord; lParam: LPARAM): BOOL; stdcall;
begin
result :=R_EnumProcc(hWnd,lParam); //编译器在这里提示:[错误] : Missing operator or semicolon
end;
starluck 2009-03-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 lengx7 的帖子:]
C/C++ codeWNDENUMPROC R_EnumProc = NULL;

BOOL WINAPI MyEnumFunc(HWND hWnd, LPARAM lParam)
{
return R_EnumProc(hWnd, lParam);
}
BOOL WINAPI MyEnumWindows(WNDENUMPROC tsEnumFunc, LPARAM lParam)
{...}



以上这段VC的代码,怎么转换为Delphi的呢?主要是return 那里,VC的返回类型不一样也可以?
Delphi7带的源代码里有这么一句
function EnumWindows(lpEnumFunc: TFNWndEnumProc; lParam…
[/Quote]


EnumProc TFNWndEnumProc

過程的指針,按你上面的寫法,這二個是等同的一種調用。

bdmh 2009-03-11
  • 打赏
  • 举报
回复
C++:return
Delphi:Result
RAD Studio 10.2 Toyko Update2 10.2.2 KEYGEN 一键激活,安装时选择试用,安装完毕后一键激活即可。亲测可用!! Win10 Build 16299 旗舰版 亲测可用!!! 为了便于在 Lite 14.x 中使用大侠们的特别补丁,初步写成这个:Activator.exe 他的主要作用: 1、整合 elseif、unis、x-force、cjack 大虾的 Keygen 相对原始部署方式,这个 Activator 实现“一键激活”! 使用方法: 1、执行 Activator.exe 发布历史: 2017.12.14 - v14.2 1、根据 25.0.28979.1978 原版制作,基于 RadStudioKeygenSourceCodeTokyo10.2Update2CorrectedSetup.zip 的成果 2017.08.11 - v14.1 1、根据 25.0.27659.1188 原版制作,基于 elseif-Rad-Studio-Keygen-master upto 10.2.1 的成果 2017.03.26 - v14.0 1、根据 25.0.26309.314 原版制作,基于 elseif、unis、x-force、cjack 等大虾的成果 已知问题: 1、在一些操作系统上如果出现安全提示,直接确定即可。 特别感谢: 1、elseif、unis、x-force、cjack、crackerjack、dr、freecat、gateway、huayan889、kerlingen、sinner、yuto 等大侠的特别补丁,感谢诸位我知道的不知道的的大虾们的辛勤劳动! 2、iny、nevergrief、snakejiao、star5、tintin1943、ti9er、wang_80919、wuxiangyang 等等我知道的不知道的的网友们的热情测试! 3、andreas hausladen 等大虾们的无私贡献! O(∩_∩)O~ Delphi 10.2 and C++Builder 10.2 Updata2 亲测可用! Embarcadero® C++Builder 10.2 Version 25.0.28979.1978 Copyright © 2017 Embarcadero Technologies, Inc. All Rights Reserved. advapi32.dll, 10.0.16299.15, C:\WINDOWS\System32\ AEPIC.dll, 10.0.16299.15, C:\WINDOWS\SYSTEM32\ androiddebugide250.bpl, 25.0.28979.1978, d:\program files (x86)\embarcadero\studio\19.0\Bin\ appanalytics250.bpl, 25.0.28979.1978, D:\Program Files (x86)\Embarcadero\Studio\19.0\bin\ apphelp.dll, 10.0.16299.98, C:\WINDOWS\SYSTEM32\ applet250.bpl, 25.0.28979.1978, d:\program files (x86)\embarcadero\studio\19.0\bin\ asmview250.bpl, 25.0.28979.1978, d:\program files (x86)\embarcadero\studio\19.0\Bin\ ATL.DLL, 3.5.2284.0, C:\Windows\System32\ bcbandroid250.bpl, 25.0.28979.1978, d:\program files (x86)\embarcadero\studio\19.0\Bin\ bcbcoment250.bpl, 25.0.28979.1978, d:\program files (x86)\embarcadero\studio\19.0\Bin\ bcbcompro250.bpl, 25.0.28979.1978, d:\program files (x86)\embarcadero\studio\19.0\Bin\ bcbent250.bpl, 25.0.28979.1978, d:\program files (x86)\embarcadero\studio\19.0\Bin\ bcbfmxide250.bpl, 25.0.28979.1978, d:\program files (x86)\embarcadero\s

16,747

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧