Delphi + DLL + printf = magic?

Тема в разделе "WASM.WIN32", создана пользователем n0name, 22 окт 2006.

  1. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Короче обрисую ситуацию.
    Есть у меня DLL написанная на чистом Си. Использую в ней вызов printf.
    Приложение на Delphi у меня оконное, и поэтому хочу изменить стандартный поток вывода в файл. Вроде всё нормально.
    Код (Text):
    1.  hFile := CreateFile('res.txt', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS, 0, 0);
    2.  SetStdHandle(STD_OUTPUT_HANDLE, hFile);
    3.  hLib := LoadLibrary('some.dll');
    4.  @Hello := GetProcAddress(hLib, 'HelloWorld');
    5.  Hello();
    В тестовом приложении всё чики-пуки. Копирую код в рабочее приложение, где и нужно использовать сию DLL. Сразу полезли косяки. Ввод не перенапрявляется. Смотрю в чём принципиальные различия между рабочим кодом и этим. Убираю из блока uses SysUtils, всё работает. Смотрю чё выполняется в initialisation, комментирую всё, что относится к винде, подключаю, не работает. Ладно пох на SysUtils, сам написал IntToStr, StrToInt, мне не сложно :P. Оадно пишу код дальше. Оппа не работает. Комментируя код(да вот такая забавная отладка, ибо по другому никак не получалось). Дошёл до того что сразу вызываю halt(0) после тестового вызова функции. Только после того как я закомментировал CreateDialog заработало. Смотрю в чём дело, а хз. Оказалось что если в функции DialogMain -> MainDlgOnCommand -> LoadFromFile -> LoadCode закомментировать объявление локальных динамических массивов всё работает. Очень странно. Так как этот код не вызывается. Magic?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Причём самое главное до меня никак не допрёт какая взаимосвящь между консольным выводом и динамическими массивами.
     
  3. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    хз... когда у меня начинают вылезать подобные взаимосвязи, я берусь за valgrind. Иногда помогает :)
    правда не скажу, работает ли valgrind в win, но, по-любому, должны быть аналоги.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    valgrind? AFAIR это он отсложевает работу с памятью.
     
  5. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    да, чтоб ничего не писалось туда куда не надо. и чтоб условные jmp'ы в условии не использовали бы неинициализированные значения.
     
  6. _io_lock

    _io_lock Андрей

    Публикаций:
    0
    Регистрация:
    5 окт 2006
    Сообщения:
    14
    Адрес:
    Тверская область
    ИМХО, SetStdHandle не работает в оконных приложениях... поправьте если я не прав.
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Работает. Даже скажу больше, если сделать WriteFile(GetStdHandle(STD_OUTPUT), ...); то когда вызываешь программу и перенаправишь вывод в файл, то выедется.