2017-08-27 58 views
6

我正在尝试从HWND获取属性。我使用的信息来自Using Window Properties,但下面的示例不适用于我。编译我的代码时出现错误。Enum HWND属性C++

类型的参数 “BOOL(__stdcall *)(HWND hwndSubclass,LPCSTR lpszString,拉手HDATA)” 是类型参数 “PROPENUMPROCEXW” 不相容

这里是我的回调函数

BOOL CALLBACK PropEnumProcEx(HWND hwndSubclass, LPCSTR lpszString, HANDLE hData) { 
    return TRUE; 
} 

,这我怎么使用它

EnumPropsEx(hwnd, PropEnumProcEx, NULL); 

不有人对如何解决这个问题有任何建议?

+0

错误信息再清楚不过。你到底懂不懂呢? –

回答

4

LPCSTR lpszString应该是LPTSTR lpszString。该参数应该接受一个指向ANSI或Unicode空字符串的指针。 PROPENUMPROCEXW表示您正在构建Unicode应用程序,因此EnumPropsEx宏扩展为EnumPropsExW调用,因此您需要提供接受宽字符串的回调作为参数。通常,您应该始终显式调用API函数的Unicode变体。

此外您还缺少最后一个参数ULONG_PTR dwData

所以你的回调应该是这样的:

BOOL CALLBACK 
PropEnumProcEx(HWND hwndSubclass, LPTSTR lpszString, HANDLE hData, ULONG_PTR dwData) 
{ 
    return TRUE; 
} 
+2

** - 1 **“'LPCSTR lpszString'应该是'LPTSTR lpszString'”是非常好的建议。 'T'宏在1995年到2000年间有它们的时间。2000年,我们得到了Layer for Unicode,使宏变得过时。今天,我们的工具甚至无法为宏指定的系统生成可执行文件,即Windows 9x。继续将它们用于非遗留代码是件很糟糕的事情。 –

+0

@ Cheersandhth.-Alf如果这段代码应该是ANSI变体,那么也是可以接受的。我的答案包含建议更喜欢使用API​​调用的Unicode变体。 – VTT

+1

@VTT:不建议按ANSI建筑。有些读者可能会认真对待你。那么你只是为他们制造问题。承认不当行为。修复答案。 –