我在我的cpp文件中尝试下面的代码,它给了我错误:
[bcc32错误] Unit1.cpp(15):E2031无法从'int( stdcall *(_ enclosure)(HWND *,long))(HWND__ *,long)'转换为'int ( stdcall *)(HWND *,long)'
我做错了什么?
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
BOOL WINAPI EnumWindows((WNDENUMPROC) EnumWinProc, NULL);
}
BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM lParam)
{
char title[80];
GetWindowText(hwnd,title,sizeof(title));
Listbox1->Items->Add(title);
return TRUE;
}
答案 0 :(得分:1)
失去BOOL WINAPI
。你试图调用一个函数,而不是声明一个函数。
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
EnumWindows((WNDENUMPROC) EnumWinProc, NULL);
}
此外,丢失了不必要的(WNDENUMPROC)
转换。你的回调函数应该有正确的签名,如果没有,你想知道。
答案 1 :(得分:1)
你所展示的内容不是真正的代码。首先,您用于EnumWindows()
的语法是错误的,不会按原样编译。其次,错误是抱怨转换__closure
,这意味着你试图使用非静态类方法作为回调(你做不到),但你所显示的代码中没有这样的方法
这就是代码应该的样子:
class TForm1 : public TForm
{
__published:
TListBox *ListBox1;
...
private:
static BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM lParam);
...
public:
__fastcall TForm1(TComponent* Owner);
...
};
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
EnumWindows(&EnumWinProc, reinterpret_cast<LPARAM>(this));
}
BOOL CALLBACK TForm1::EnumWinProc(HWND hwnd, LPARAM lParam)
{
TCHAR title[80];
if (GetWindowText(hwnd, title, 80))
reinterpret_cast<TForm1*>(lParam)->ListBox1->Items->Add(title);
return TRUE;
}
可替换地:
// Note: NOT a member of the TForm1 class...
BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM lParam)
{
TCHAR title[80];
if (GetWindowText(hwnd, title, 80))
reinterpret_cast<TStrings*>(lParam)->Add(title);
return TRUE;
}
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
EnumWindows(&EnumWinProc, reinterpret_cast<LPARAM>(ListBox1->Items));
}