У нас возникли те же проблемы, которые вы описали (хотя в C ++ Builder). Кажется, есть три возможных решения.
1) Удалите все зависимости VCL из ваших DLL. Это то, к чему в конечном итоге стремится моя компания, но, вероятно, это не очень полезный совет в краткосрочной перспективе.
2) Используйте пакеты вместо DLL. Это официальный ответ, который мы получили от поддержки Borland (давно). По-видимому, если вы создадите пакет (BPL) вместо DLL, он может лучше справиться с выяснением инициализации VCL.
3) Я не знаю, какие скрытые проблемы скрываются с этим третьим решением, потому что это довольно взломано, но вот как я в настоящее время применяю пластырь к нашей системе, пока мы не сможем получить VCL из наших DLL (и это кажется для работы).
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
delete Application;
Application = new TApplication(NULL);
Но я должен признаться, что это заставляет меня немного нервничать (и это заставляет меня чувствовать себя немного грязно).
Идея, которую, как я уверен, вы можете перевести на Паскаль, состоит в том, чтобы уничтожить исходный объект TApplication, созданный DLL и назначенный глобальной переменной Application
. Затем создайте свой собственный объект TApplication
в исполняемом файле WinMain
и назначьте его глобальной переменной Application
. Пока ничто не хранит указатель на исходный объект TApplication, прежде чем вы получите возможность его выбросить, похоже, что все должно быть в порядке.