2013-08-08 2 views
-1

У меня есть Delphi XE3, Windows 7 Pro 64bit. Мое приложение отлично работает на моем ПК, но мои пользователи сказали мне, что при сбое приложений на Win Win XP и также (!!) на их Win 7.Ошибка приложения по WinXP

Я попытался запустить приложение на своей Win 7, но зарегистрировался как обычный пользователь (без администратора) - он работает. Итак, теперь я установил виртуальную машину с Windows XP и действительно - при сбое приложения происходит сбой.

Мне нужно найти, что может быть проблемой, но я беспомощен.

Насколько я не могу использовать отладчик (я не имею Delphi на этой виртуальной машине установлен), Я пытался поставить некоторые MessageBox(0, 'Hello', 'Test', MB_OK); в различных местах, в мое приложение, чтобы поймать место, где это происходит, и это то, что я нашел :

у меня есть это в моем проекте-источнике:

MessageBox(0, 'Hello', 'Test', MB_OK); // shows OK 
Application.CreateForm(TfMain, fMain); 
MessageBox(0, 'Hello', 'Test', MB_OK); // doesn't show - crash before this line 

И это в OnCreate функции моей главной формы, которая называется fMain:

procedure TfMain.FormCreate(Sender: TObject); 
begin 
    MessageBox(0, 'Hello', 'Test', MB_OK); // doesn't show - crash before this line 
    ... 

Итак, где может произойти сбой этого приложения?
Выполняется даже первая строка в OnCreate ....
Я понятия не имею ... Кто-нибудь?

Не знаю, важно ли это: у меня есть некоторые единицы в статье fMain uses под номером interface, а также под implementation. Должен ли я там посмотреть? Но что происходит непосредственно перед OnCreate моей основной формы?

+0

Вы не можете отлаживать, потому что у вас нет Delphi, установленного на вашей виртуальной машине. Вы знаете, что есть несколько действительно простых способов исправить это, не так ли? –

+2

@ Rob Kennedy Хммм, если бы я знал, я бы сделал это. Какие-нибудь советы? – Enriqe

+1

Я не Роб, но с головы: 1) Установите Delphi на эту виртуальную машину. 2) Используйте удаленный отладчик (подробности см. В документации по Delphi [http://docwiki.embarcadero.com/RADStudio/en/Installing__Starting,_and_Stopping_the_Remote_Debug_Server]). Что до того, что происходит непосредственно перед 'OnCreate' ?, используйте источник. Вы найдете это в 'Forms.pas'. –

ответ

1

Наконец я получил его!

  • место PRINT DIALOG компонент на форме (TPrintDialog)
  • набор COPIES = 1 (или больше нуля по умолчанию) в инспекторе объектов во время разработки
  • попытаться запустить такое приложение на WinXP, где NO ПРИНТЕРЫ не установлены

Применение просто падает при запуске и в деталях, вы увидите только некоторые kernel32.dll адрес ...

Я Бесполезный Не тестируйте его на Win 7 без принтеров. У меня нет такой системы вокруг ...

0

Вот еще один способ отслеживать это вниз без Delphi на виртуальной машине ...

  • Скопируйте ваш проект.
  • Удалите все единицы из Project Source, кроме основной формы.
  • Запустите приложение с XP, если оно сработает.

  • Если он сработает ... затем посмотрите, какие единицы перетаскиваются из вашей основной формы ... начните их удалять, пока ваша программа не перестанет сбой.

  • Если это не сбой ... начните добавлять единицы/формы обратно в источник проекта, пока не сработает.

У вас есть JCL/JVCL (JEDI)?

Если это так, создайте регистратор ... обратите внимание, что Logger необходимо создать и подключить до запуска кода MainForm ... Вам также нужно будет настроить подробную трассировку стека из необработанных исключений, в Delphi select-> Проект/Настройки/Linker файл/Карта/Подробное}

Вам нужно что-то подобное в вашем Logger блоке

procedure HookGlobalException(ExceptObj: TObject; ExceptAddr: Pointer; OSException: Boolean); 
var 
    a_List: TStringList; 
begin 
    if Assigned(TLogger._Instance) then 
    begin 
    a_List := TStringList.Create; 
    try 
     a_List.Add(cStar); 
     a_List.Add(Format('{ Exception - %s }', [Exception(ExceptObj).Message])); 
     JclLastExceptStackListToStrings(a_List, False, True, True, False); 
     a_List.Add(cStar); 
    // save the error with stack log to file 
     TLogger._Instance.AddError(a_List); 
    finally 
     a_List.Free; 
    end; 
    end; 
end; 


initialization 
    Lock := TCriticalSection.Create; 
    Include(JclStackTrackingOptions, stTraceAllExceptions); 
    Include(JclStackTrackingOptions, stRawMode); 

    // Initialize Exception tracking 
    JclStartExceptionTracking; 

    JclAddExceptNotifier(HookGlobalException, npFirstChain); 
    JclHookExceptions; 

finalization 
    JclUnhookExceptions; 
    JclStopExceptionTracking; 
    Lock.Free; 
+0

забыл, что нужно добавить это в свое использование для вашего регистратора JclDebug, JclHookExcept –