我有以下代码: -
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
char ay[256]={0};//HWND hwnd= GetForegroundWindow();
if( GetClassName(hwnd,ay,256))
{
char x[70]={0};
GetWindowText(hwnd,x,70);
if(IsWindowVisible(hwnd))
{
// CaptureAnImage(hwNd,hwnd);
HINSTANCE hins= (HINSTANCE) GetWindowLong(hwnd,GWL_HINSTANCE);
WNDCLASSEX lpwcx;
GetClassInfoEx(hins,ay,&lpwcx);
if (MessageBox(0,
strcat(strcat(x, "\r\n"), lpwcx.lpszClassName),
"Info", 0x06L) == IDTRYAGAIN)
{
return false;
}
}
}
return true;
}
void cstm()
{
EnumWindows(EnumWindowsProc,0);
}
这在Codeblocks上运行正常(使用VS 2010编译器(cl))但是VS2010提供了损坏的lpwcx值,我已经尝试使用Unicode和Ascii来解决这个问题但是没有很好的结果 所有。第一个lpwcx是正确的,但后来它们返回class not found(1411),尽管hinstance和类名是正确的。
请帮忙。
答案 0 :(得分:1)
strcat(strcat(x, "\r\n"), lpwcx.lpszClassName),
这会溢出 x 缓冲区并踩踏一些局部变量值(如* lpwcx“)的几率非常高.70个字符是不合理的节俭。如果你不想使用strcat_s ()然后至少使它变大。是的,初始化lpwcx.cbSize
答案 1 :(得分:0)
在调用任何API函数之前,始终填写数据块的cbSize成员。他们中的许多人依赖这个值来知道他们应该填写哪个版本的数据结构。