Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2012, 13:44   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
Печаль delphi XE2 Передать указатель на тип record в EnumWindows. Вылет в IntOverFlow или AV

Доброго времени суток!

Переношу проект в новую среду разработки..

Обьявлен некий тип record, нужно передать его указатель, в EnumWindows.

В delphi 7 работал такой код:
Код:
    if EnumWindows(@EnumProc, Integer(@sRec)) then
    begin
      ...
    end;
В XE2 с этим проблема. Такой код вылетает в EIntOverFlow.
Замема на DWORD приводит лишь к Access Violation..

Последний раз редактировалось Человек_Борща; 10.02.2012 в 13:47.
Человек_Борща вне форума Ответить с цитированием
Старый 10.02.2012, 15:43   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А в XE2 длина указателя случайно не 8 байт? Для 64-битного приложения скорее всего так и есть
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 10.02.2012 в 15:55.
Аватар вне форума Ответить с цитированием
Старый 10.02.2012, 16:38   #3
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ctrl + клик на EnumWindows подсказывает, что первый параметр у неё - Pointer, а второй - NativeInt.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 10.02.2012, 20:32   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Аватар, пишу 32-битное приложение.
GunSmoker, мне надо передать указатель на тип, а не сами данные.
Попытка передать EnumWindows(@EnumProc, NativeInt(@sRec)), так же закончилась AV.
Человек_Борща вне форума Ответить с цитированием
Старый 10.02.2012, 20:56   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

А запись-то где расположена?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 10.02.2012, 21:35   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

тип
Код:
type
  TWindowSearchInfo = record
    swClass: string; 
    swTitle: string;
    swText: string; 
    swAction: TFoundedWindowAction; 
    swButtonClass: string; 
    swButtonText: string; 
    WindowInfo: PFoundedWindowInfo;
    swFound: Boolean; 
    swFoundButton: Boolean; 
  end;

кусок процедуры
Код:
...
var
  i: Integer;
  sRec: TWindowSearchInfo;
  pID: Cardinal;
begin
  for i := 0 to Count - 1 do
  begin
    FillChar(sRec, 0, SizeOf(TWindowSearchInfo));
 
     if EnumWindows(@EnumProc, NativeInt(@sRec)) then
      begin

      end; 

  end;
Кто-нибудь может мне помочь?

Последний раз редактировалось Человек_Борща; 11.02.2012 в 00:14.
Человек_Борща вне форума Ответить с цитированием
Старый 11.02.2012, 02:44   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

У FillChar параметры перепутаны.

Больше ошибок нет. Приведи остальной код.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 11.02.2012, 17:35   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

GunSmoker, писал тут.
Вот весь метод с использованием этой структуры:
Код:
procedure TWindowsManager.OnTimer(Sender: TObject);
var
  i: Integer;
  sRec: TWindowSearchInfo;
  fRec: TFoundedWindowInfo;
  pID: Cardinal;
begin
  for i := 0 to Count - 1 do
  begin
    FillChar(sRec, 0, SizeOf(TWindowSearchInfo));
    FillChar(fRec, 0, SizeOf(TFoundedWindowInfo));
    sRec.swClass := Windows[i].WindowClass;
    sRec.swTitle := Windows[i].WindowTitle;
    sRec.swText := Windows[i].WindowText;
    sRec.swAction := Windows[i].Action;
    sRec.swButtonClass := Windows[i].WindowBtnClass;
    sRec.swButtonText := Windows[i].WindowBtnText;
    sRec.WindowInfo := @fRec;
    sRec.swFound := False;
    sRec.swFoundButton := False;
     if EnumWindows(@EnumProc, NativeInt(@sRec)) then //ERROR
      begin

      end;

    if sRec.swFound then
    begin
      case sRec.swAction of
        fwaClose:
          SendMessage(fRec.wHandle, WM_CLOSE, 0, 0);
        fwaClickButton:
          begin
            if sRec.swFoundButton then
            begin
              SendMessage(fRec.wButtonHandle, WM_LBUTTONDOWN, 1, 1);
              SendMessage(fRec.wButtonHandle, WM_LBUTTONUP, 1, 1);
            end;
          end;

        fwaTerminateProcess:
          begin
            GetWindowThreadProcessId(fRec.wHandle, @pID);
            if pID <> 0 then
              if ProcessTerminate(pID) then
               //!inf IF TWindowsManager.OnTimer
              else
               //!inf ENDIF TWindowsManager.OnTimer
          end;
      end;
    end;
  end;
end;
Человек_Борща вне форума Ответить с цитированием
Старый 12.02.2012, 21:57   #9
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Может так:
Код:
EnumWindows(Pointer(EnumProc), LPARAM(Pointer(sRec)));
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi XE2 и IOs diversenok Общие вопросы Delphi 1 20.12.2011 21:31
Delphi XE2 TorrentTor Общие вопросы Delphi 4 05.12.2011 19:06
Embarcadero Delphi XE2 Partner DVD (Зборник компонентов для XE2) volod3000 Софт 2 01.11.2011 02:26
Передать статический record по сети Toland2 Работа с сетью в Delphi 0 24.10.2011 18:30
DLL, type RECORD, как передать данные в него? Человек_Борща Общие вопросы Delphi 3 08.09.2011 02:25