Можем ли мы использовать `LoadLibrary`, скомпилировав наше приложение с Visual Studio 2010 и статической средой выполнения? - PullRequest
0 голосов
/ 25 сентября 2011

То, что я хочу, это просто - иметь приложение C ++, которое будет скомпилировано с статическим временем выполнения (/MT, /MTd flags) и способно открывать, вызывать и т. Д. классы и функции из DLL (используя LoadLibrary , C ++).Возможна ли такая вещь?

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Я думаю, вы все перепутали.То, что он называется «статическим» временем выполнения, означает, что код для стандартных библиотек C и C ++ статически связан с вашим приложением.Как правило, это никогда не налагает никаких ограничений на то, что может делать ваше приложение.

Все стандартные классы библиотек, такие как ifstream и функции, такие как printf, будут использоваться независимо от того, находится ли их код внутри вашего EXE-файла встатическая среда выполнения или вне вашего EXE в динамической среде выполнения.Все функции Win32, такие как LoadLibrary и GetProcAddress, всегда находятся за пределами вашего приложения в обычных DLL-библиотеках Windows (например, Kernel32.dll), поэтому они, безусловно, не зависят от вашего выбора времени выполнения.

I 'Я бы сказал, что ваша настоящая проблема заключается в попытке вызвать методы C ++, используя GetProcAddress.Этот Win32 API предназначен только для динамического вызова функций Си.Первая проблема, с которой вы столкнетесь, заключается в том, что вы не сможете найти имена методов из-за искажения имен C ++ .У вас также могут быть проблемы с размещением объектов.Моя интуиция говорит мне, что было бы почти невозможно заставить работать правильно.

Вот три предлагаемых альтернативы вместо прямого вызова методов C ++ с использованием GetProcAddress:

  1. Оберните ваш C ++методы в функциях C.
  2. Используйте C ++ Framework, например COM или Qt plugins , для настройки динамических интерфейсов DLL.
  3. Используйте другую платформу, например .NET или Java;тот, который имеет полную поддержку объектно-ориентированного отражения и динамического вызова.
1 голос
/ 25 сентября 2011

Это не невозможно. Но сделать его универсальным и надежным - очень дальний выстрел. В C ++ нет стандартизированного формата метаданных, который позволял бы вам знать, что вы передаете правильные аргументы. Даже имя экспортированного класса или функции не легко угадать, это деталь реализации компилятора.

COM Automation будет примером, где эти проблемы решаются. Покрывается тестовым контейнером ActiveX. Или поддержка отражения в таких языках, как Java или .Net управляемые языки. Не C ++.

...