Конференция "Прочее" » Приложение падает на Application.Initialize;
 
  • keymaster © (22.08.08 16:12) [0]
    Какие могут быть причины?
  • Германн © (22.08.08 16:14) [1]

    > Какие могут быть причины?

    Ошибка в программе.
  • Игорь Шевченко © (22.08.08 16:16) [2]
    приложение падает на initialization какого-то юнита
  • Ega23 © (22.08.08 16:18) [3]

    Provides an opportunity to initialize subsystems.

    Delphi syntax:

    procedure Initialize;

    C++ syntax:

    void __fastcall Initialize(void);

    Description

    Initialize is the first method called by the project source file. It calls the InitProc procedure pointer. By default, the call to Initialize for the application does nothing because the default InitProc pointer is nil (Delphi) or NULL (C++) .

    To use Initialize, the InitProc pointer must be predefined. This can be accomplished in one of two ways:

    In Delphi, you can include a unit that assigns a procedure to InitProc in its initialization section, such as the ComObj unit. You can make this assignment in the initialization section of any of your units.
    In both Delphi and C++, you can create a custom initialization procedure that assigns a value to the InitProc pointer, and add a call to this procedure to the project source prior to the call to Initialize. (In Delphi, you can add it to the initialization section of the unit in which it is declared. In C++, you can use the pragma startup directive in that unit.)

    Warning: Only one instance of InitProc can be defined in an application. If more than one unit assigns a value to InitProc, only the last assignment will work. You can, however, call the previous value of InitProc from an initialization procedure, so that all initialization procedures are executed.

    For projects that do not assign a value to InitProc, the call to Initialize can be safely deleted from the project source.

    Note: Although Initialize is the first method called in the main project source code, it is not the first code that is executed in a GUI application. For example, in Delphi, the application first executes the initialization section of all the units used by the application.

  • Сергей М. © (22.08.08 16:21) [4]

    > приложение падает на initialization какого-то юнита


    Не-а.
    К разделам initialization юнитов в составе проекта метод Application.Initialize отношения не имеет.
  • Сергей М. © (22.08.08 16:22) [5]
    То бишь код этих разделов выполняется до вызова этого метода.
    Которого, впрочем, за неимением объекта Application может вообще и не быть, что никак не мешает инициализации юнитов.
  • Anatoly Podgoretsky © (22.08.08 16:27) [6]
    > keymaster  (22.08.2008 16:12:00)  [0]

    На данной строке нажать F7

    > Initialize is the first method called by the project source file. It calls the InitProc procedure pointer. By default, the call to Initialize for the application does nothing because the default InitProc pointer is nil
  • keymaster © (22.08.08 16:37) [7]

    > Anatoly Podgoretsky ©   (22.08.08 16:27) [6]
    > > keymaster  (22.08.2008 16:12:00)  [0]На данной строке
    > нажать F7> Initialize is the first method called by the
    > project source file. It calls the InitProc procedure pointer.
    >  By default, the call to Initialize for the application
    > does nothing because the default InitProc pointer is nil

    Там пусто. Никаких указателей не используем.
    Вопрос ещё в том, что глюк воспроизводится только на одной машине.
    На машинах разработчиков и почти на всех пользовательских - всё работает как надо.
  • Anatoly Podgoretsky © (22.08.08 16:43) [8]
    > keymaster  (22.08.2008 16:37:07)  [7]

    Отсюда делаем единственный вывод - Приложение падает не на Application.Initialize;
  • DrPass © (22.08.08 16:44) [9]

    > Вопрос ещё в том, что глюк воспроизводится только на одной
    > машине.

    Если это не машина разработчиков - ты уверен, что там у тебя актуальная версия исходников?
  • clickmaker © (22.08.08 16:47) [10]
    > ты уверен, что там у тебя актуальная версия исходников?

    хм.. а причем тут исходники на машине, где работает экзешник?
  • keymaster © (22.08.08 16:55) [11]

    > Anatoly Podgoretsky ©   (22.08.08 16:43) [8]
    > > keymaster  (22.08.2008 16:37:07)  [7]Отсюда делаем единственный
    > вывод - Приложение падает не на Application.Initialize;

    Пишем лог с первой строки.
    Всё, что до Application.Initialize - работает.
    На строке  Application.Initialize появляется AV
  • Игорь Шевченко © (22.08.08 16:58) [12]

    > Пишем лог с первой строки.
    > Всё, что до Application.Initialize - работает.
    > На строке  Application.Initialize появляется AV


    а содержимое строчек является Главной Военной Тайной ?
  • DrPass © (22.08.08 17:26) [13]

    > clickmaker ©   (22.08.08 16:47) [10]
    > > ты уверен, что там у тебя актуальная версия исходников?
    >
    >
    > хм.. а причем тут исходники на машине, где работает экзешник?
    >

    Я ж предположил, что он до Applicaton.Initialize добрался отладчиком. А если он там лог пишет... нууу, это еще ни о чем не говорит :)
  • keymaster © (22.08.08 17:55) [14]

    > а содержимое строчек является Главной Военной Тайной ?

    Строка первая, идёт сразу после begin:
    22.08.2008  15:42  Application Started
    Строка вторая - там работает FindWindow (для поиска запущеных копий приложения):
    22.08.2008  15:42  FindWindow Result = Not Found
    Строка третья:
    Application Initialize

    А дальше - AV
  • Dimka Maslov © (22.08.08 18:29) [15]
    Код, выполняемый выше Application.Initialize, разрушает стек.
  • Юрий Зотов © (22.08.08 18:58) [16]
    Вщзможно, что-то напортачено с выделением/освобождением памяти под параметры PChar в FindWindow?
  • Игорь Шевченко © (22.08.08 19:24) [17]

    > Строка первая, идёт сразу после begin:
    > 22.08.2008  15:42  Application Started
    > Строка вторая - там работает FindWindow (для поиска запущеных
    > копий приложения):
    > 22.08.2008  15:42  FindWindow Result = Not Found
    > Строка третья:
    > Application Initialize
    >
    > А дальше - AV


    Я уже понял, что ты партизан, а форум - злобные гестаповцы. Можешь хранить свою военную тайну дальше, тебе медаль дадут за стойкость.
  • Германн © (22.08.08 20:28) [18]

    > тебе медаль дадут за стойкость.

    Посмертно! (((
  • keymaster © (22.08.08 21:18) [19]

    > Юрий Зотов ©   (22.08.08 18:58) [16]
    > Вщзможно, что-то напортачено с выделением/освобождением
    > памяти под параметры PChar в FindWindow?

    Хм...
    Тогда почему:
    а) не падает на строке с FindWindow
    б) работает на всех компах, кроме одного...
  • Германн © (22.08.08 21:22) [20]

    > б) работает на всех компах, кроме одного...
    >

    Пока работает. Так карты выпали. Испорченная память не всегда приводит к AV.
  • Сергей М. © (22.08.08 21:27) [21]

    > почему:
    > а) не падает на строке с FindWindow


    А это совсем другая история)

    И с какого собссно перепугу там что-то куда-то должно "падать" ?
    Нет, ну завалить , конечно, при особом перепуге можно что угодно.. Но ведь это еще и постараться нужно !)

    > б) работает на всех компах, кроме одного...


    То ли тебе не повезло, то ли у тебя ошибка в 17-й строке)

    Я  - за 17-ю строку, ежели что)..
  • Юрий Зотов © (22.08.08 21:54) [22]
    > keymaster ©   (22.08.08 21:18) [19]

    > Хм... Тогда почему...

    Хм... не знаю. Я программист, а не гадалка. Вам ведь уже насчет партизана и 17-й строки сказали? Неужели код вызова FindWindow настолько секретен?
  • Урсулапов (22.08.08 22:23) [23]
    Будьте осторожны, за пытку программиста-партизана и выбивания из него кода программы можете попасть под Гаагский трибунал. И за меньшее сажали :)))
  • Урсулапов (22.08.08 22:24) [24]
    Или как там еще, не дай бог Буш приедет ему помогать. Прошу прощения.
  • keymaster © (22.08.08 22:42) [25]

    > Хм... не знаю. Я программист, а не гадалка. Вам ведь уже
    > насчет партизана и 17-й строки сказали? Неужели код вызова
    > FindWindow настолько секретен?


     if FindWindow(nil, 'Ouverture') <> 0 then
     begin
       MessageBox(0, 'Приложение уже запущено', 'Ouverture', 0);
       exit;
     end;

  • Урсулапов (22.08.08 22:47) [26]
    Я в этом не силен, но, может, окно надо искать после создания окна?
  • Сергей М. © (22.08.08 22:53) [27]

    > if FindWindow(nil, 'Ouverture') <> 0 then


    Кто-нибудь видит в этой строке хоть малейший повод для "падения" кого-то там куда-то там ?

    Я не вижу ..
  • keymaster © (22.08.08 22:59) [28]

    > Я в этом не силен, но, может, окно надо искать после создания
    > окна?

    Надо найти такое же окно.  И если оно уже есть - то вообще завершать работу.
  • Andy BitOff © (22.08.08 23:00) [29]
    > keymaster ©   (22.08.08 22:42) [25]

    Нужен код от:

    > Строка первая, идёт сразу после begin:
    > 22.08.2008  15:42  Application Started

    и до...

    > А дальше — AV
  • Сергей М. © (22.08.08 23:02) [30]

    > keymaster ©   (22.08.08 22:59) [28]
    > Надо найти такое же окно.  И если оно уже есть - то вообще
    > завершать работу


    Ну и ищи его себе на здоровье, хоть до второго пришествия ..

    Но причем здесь Application.Initialize ?
  • Virgo_Style © (22.08.08 23:25) [31]
    Ну.. Если не должно, а все-ж таки падает, и именно на этой строке - я б попробовал #0 к строке добавить.
  • keymaster © (22.08.08 23:26) [32]

    > Сергей М. ©   (22.08.08 23:02) [30]
    > > keymaster ©   (22.08.08 22:59) [28]> Надо найти такое
    > же окно.  И если оно уже есть - то вообще > завершать работуНу
    > и ищи его себе на здоровье, хоть до второго пришествия .
    > .

    Вы это о чём, собственно?
    Мне нужно найти определённое окно с целью предотвращения запуска второй копии приложения.


    > Andy BitOff ©   (22.08.08 23:00) [29]
    > > keymaster ©   (22.08.08 22:42) [25]Нужен код от:> Строка
    > первая, идёт сразу после begin:> 22.08.2008  15:42  Application
    > Startedи до...> А дальше — AV

    begin
    Log('Application Started');
    if FindWindow(nil, 'Ouverture') <> 0 then
    begin
      MessageBox(0, 'Приложение уже запущено', 'Ouverture', 0);
      exit;
    end;
    Log('FindWindow Result = Not Found');
    Log('Application.Initialize');
    Application.Initialize;

  • Andy BitOff © (22.08.08 23:31) [33]
    Покажи Log()
  • keymaster © (22.08.08 23:45) [34]

    > Andy BitOff ©   (22.08.08 23:31) [33]
    > Покажи Log()

    procedure Log(msg : String);
    var
    FLogFile : TextFile;
    begin
     AssignFile(FLogFile, 'log.txt');
     Append(FLogFile);
     Writeln(Flogfile, DateTimeToStr(now)+#32+msg);
     CloseFile(FLogFile);
    end;

  • Anatoly Podgoretsky © (22.08.08 23:47) [35]
    > Сергей М.  (22.08.2008 22:53:27)  [27]

    Вот справка

    If the function fails, the return value is NULL. To get extended error information, call GetLastError.
  • Anatoly Podgoretsky © (22.08.08 23:49) [36]
    > keymaster  (22.08.2008 22:59:28)  [28]

    Поиск окна не гарантирует правильности, для гарантии надо использовать мьютекс.
  • keymaster © (22.08.08 23:59) [37]

    > Anatoly Podgoretsky ©   (22.08.08 23:49) [36]
    > > keymaster  (22.08.2008 22:59:28)  [28]Поиск окна не гарантирует
    > правильности, для гарантии надо использовать мьютекс.

    так не в этом месте AV возникает...
  • Andy BitOff © (23.08.08 00:02) [38]
    > keymaster ©

    Ну что я могу сказать, здесь ошибок нет, если не считать таковой то, что при отсутствии log.txt будет ошибка, которая не проверяется. В остальном нормально, должно работать. Ищи в другом месте. Пройди по F7.
  • Anatoly Podgoretsky © (23.08.08 00:11) [39]
    > keymaster  (22.08.2008 23:59:37)  [37]

    Совет про мьютекс не связан с AV
  • Германн © (23.08.08 01:12) [40]

    > ... но, может, окно надо искать после создания
    > окна?
    >


    >
    > begin
    > Log('Application Started');
    > if FindWindow(nil, 'Ouverture') <> 0 then
    > begin
    >   MessageBox(0, 'Приложение уже запущено', 'Ouverture',
    > 0);
    >   exit;
    > end;
    > Log('FindWindow Result = Not Found');
    > Log('Application.Initialize');
    > Application.Initialize;
    >

    А при чем тут после или до? В приведенном коде нет никакого создания никакого окна.
    Партизанщина продолжается. Автор опять подсунул какой-то огрызок вместо реального кода.
  • Servy © (23.08.08 03:38) [41]
    > begin
    > Log('Application Started');
    > if FindWindow(nil, 'Ouverture') <> 0 then
    > begin
    >  MessageBox(0, 'Приложение уже запущено', 'Ouverture',
    > 0);
    >  exit;
    > end;
    > Log('FindWindow Result = Not Found');
    > Log('Application.Initialize');
    > Application.Initialize;


    Судя по всему, ошибки здесь нет, она в другом месте. Например, такое можно сэмулировать, если в любом используемом модуле написать что-нибудь в духе

    initialization
     Application := TApplication($12345678);



    То есть, попортить указатель на Application.
  • Cobalt (23.08.08 08:44) [42]
    Самый простой способ отладки - это отключать (закомментировать) функционал до тех пор, пока ошибка не прекратится.
  • keymaster © (23.08.08 09:13) [43]

    > Cobalt   (23.08.08 08:44) [42]
    > Самый простой способ отладки - это отключать (закомментировать)
    > функционал до тех пор, пока ошибка не прекратится.

    Ошибка исчезает если закоментировать строку
    Application.Initialization

    > А при чем тут после или до? В приведенном коде нет никакого
    > создания никакого окна.Партизанщина продолжается. Автор
    > опять подсунул какой-то огрызок вместо реального кода.

    Я привел реальный код из реального приложения.
    При чём тут создание окна вообще?
  • Loginov Dmitry © (23.08.08 10:15) [44]
    > Ошибка исчезает если закоментировать строку
    > Application.Initialization


    Поставь галку "Use Debug DCUs" и посмотри что происходит при вызове Application.Initialization. Попасть можешь в следующие модули:
    - SockApp.pas
    - ComObj.pas
    - ComServ.pas
    - OleAuto.pas

    Возможно, подключен еще какой-нибудь сторонный модуль, портящий значение System.InitProc.
  • sniknik © (23.08.08 11:57) [45]
    > Ошибка исчезает если закоментировать строку
    > Application.Initialization
    лучше закомментируй не ее, а то, что до этой строки, вплоть до begin, и проверь тогда ошибка исчезнет? это более показательно.
  • keymaster © (23.08.08 15:49) [46]

    > sniknik ©   (23.08.08 11:57) [45]
    > > Ошибка исчезает если закоментировать строку> Application.
    > Initializationлучше закомментируй не ее, а то, что до этой
    > строки, вплоть до begin, и проверь тогда ошибка исчезнет?
    >  это более показательно.

    исчезает.
    А если коментить эту строку - то появляется.
  • Andy BitOff © (23.08.08 16:16) [47]
    У тебя есть секции Initialization?
  • sniknik © (23.08.08 16:45) [48]
    > исчезает.
    ну так, какие тогда сомнения?

    > А если коментить эту строку - то появляется.
    не удивительно, если закоментить инициализацию(создание обьектов в ней) то обращение к неинициализированному даст ошибку.
  • ketmar © (23.08.08 17:58) [49]
    ну блин. какая-то initialization попртила память. где-то не повезло, и попортила так, что смогло запуститься. а где-то повезло, и падает сразу. однако ж не понимаю, почему не пройтись при помощи отладчика по этому всему, раз уж бесплатного аналога valgrind под виндой нет.

    ---
    All Your Base Are Belong to Us
  • Германн © (23.08.08 18:31) [50]

    > ketmar ©   (23.08.08 17:58) [49]

    Крутые программеры не пользуются отладчиком. Предпочитают партизанствовать на форуме.
 
Конференция "Прочее" » Приложение падает на Application.Initialize;
Есть новые Нет новых   [134442   +10][b:0][p:0.002]