请熟悉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 吧……
...全文
105 8 打赏 收藏 转发到动态 举报
写回复
用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

16,748

社区成员

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

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