gpt4 book ai didi

c++ - 为什么用指针调用 GetWindowRect 会导致异常但地址不会

转载 作者:行者123 更新时间:2023-11-30 00:36:46 24 4
gpt4 key购买 nike

我在一个 dll 中有一个实用函数,可以将我的表单置于主机应用程序屏幕的中心。我正在使用 RAD Studio XE2。我必须手动执行此操作,因为主机应用程序是非 VCL 并且 TForm 的表单放置参数无法正常工作。下面的代码有效。这两个函数都声明为静态的,并且我之前已将应用程序句柄属性设置为主机应用程序。

   void MyClass::GetAppCenter(POINT * pos) {
RECT Rect;
GetWindowRect(Application->Handle, &Rect);
pos->x = (Rect.left + Rect.right) / 2;
pos->y = (Rect.top + Rect.bottom) / 2;
}

void MyClass::PlaceForm(TForm * f) {
POINT pos;
GetAppCenter(&pos);
for (int i = 0; i < Screen->MonitorCount; i++) {
TRect r = Screen->Monitors[i]->WorkareaRect;
if (r.Contains(pos)) {
f->Left = (r.Left + r.Right) / 2 - f->Width / 2;
f->Top = (r.Top + r.Bottom) / 2 - f->Height / 2;
return;
}
}
}

我最初的 GetAppCenter 代码使用了一个 Rect * 并返回了正确的值,但是当我设置 f->Left 时抛出了一个 Access Violation 异常。谁能解释一下为什么?

   // original version
void OasisUtils::GetOasisCenter(POINT * pos) {
RECT *Rect;
GetWindowRect(Application->Handle, Rect);
pos->x = (Rect->left + Rect->right) / 2;
pos->y = (Rect->top + Rect->bottom) / 2;
delete Rect; // tried with and without this
}

最佳答案

  RECT *Rect;
GetWindowRect(Application->Handle, Rect);
//Rect->left

这是不正确的。 GetWindowRect 需要一个有效的 RECT* 参数,以便它填充此指针指向的内存。相反,您传递的是一个未初始化的指针,期望某些魔法会使它有效。相反,您遇到了访问冲突。你需要:

  RECT Rect;
GetWindowRect(Application->Handle, &Rect); // <<--- Note &
//Rect.left

关于c++ - 为什么用指针调用 GetWindowRect 会导致异常但地址不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15142931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com