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