2015-09-01 2 views
0

Я пытаюсь код, приведенный ниже в моем файле CPP, и это дает мне ошибку:Как показать общее количество окон с помощью студии rad?

[bcc32 Error] Unit1.cpp(15): E2031 Cannot cast from 'int (stdcall * (_closure)(HWND *,long))(HWND__ *,long)' to '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

То, что вы показали, не может быть вашим реальным кодом. Во-первых, синтаксис, который вы используете для 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)); 
} 
1

Lose BOOL WINAPI. Вы пытаетесь вызвать функцию, а не объявлять ее.

__fastcall TForm1::TForm1(TComponent* Owner) 
: TForm(Owner) 
{ 
    EnumWindows((WNDENUMPROC) EnumWinProc, NULL); 
} 

Также потерять ненужное (WNDENUMPROC) преобразование. Ваша функция обратного вызова должна иметь правильную подпись, а если нет, вы хотите знать.

Смежные вопросы