Распространяемый компилятор - DLL для MS Visual Studio - PullRequest
4 голосов
/ 18 февраля 2010

Я делаю обучающую игру по программированию для своего старшего проекта и ищу компилятор, который может скомпилировать DLL, которая затем может быть динамически загружена в приложение Visual Studio 2008 C ++.

Важной идеей здесь является то, что компилятор является распространяемым. Если бы VS был распространяемым, я бы использовал это.

Пока что у меня был некоторый успех при использовании MinGW, но этот успех ограничен. В настоящее время я могу загрузить и работать только с одной DLL одновременно. В тот момент, когда я пытаюсь загрузить вторую, приложение VS C ++ вылетает с ошибкой Access Violation.

Мне удалось без проблем загрузить две библиотеки DLL, скомпилированные в самой VS, поэтому я уверен, что это что-то специфическое для MinGW, это библиотеки DLL и как они взаимодействуют с LoadLibrary () и еще чем-то.

Я работал над этой проблемой довольно долго, и я расстроен. Если кто-то знает о другом компиляторе, который, как вы знаете, будет работать вместо MinGW, или если вы видели эту проблему, возможно, вы знаете, почему вторая DLL дает сбой. Я уверен, что это связано с тем, что каждая DLL так или иначе наступает на другую, но я понятия не имею, что это будет и как это выяснить.

Это может быть способ, которым я компилирую DLL или как я ее загружаю; Понятия не имею.

Буду очень признателен за отзыв, спасибо!

Edit: Это простые вызовы g ++ и dlltool для создания DLL http://pastebin.com/f675df4b0

Это источник из одной из моих DLL. http://pastebin.com/f5c062611

Это код в моем приложении C ++ для загрузки DLL. http://pastebin.com/f52f94a18

-Michael

Ответы [ 2 ]

1 голос
/ 18 февраля 2010

Достаточно ли будет просто использовать Visual Studio Express? Компилятор можно загрузить бесплатно, и он избавит вас от лишних усилий, пытаясь обеспечить совместимость DLL-библиотек.

Я не знаю, насколько строги ваши требования, но есть вероятность, что если вы проверите информацию о лицензировании в Visual Studio Express, она окажется достаточно свободной для вашего проекта.

0 голосов
/ 18 февраля 2010

Вы возвращаете 0 из DllMain.Согласно спецификации, вы должны вернуть TRUE, если что-то пойдет не так.Однако я не могу понять, почему это должно давать другое поведение на MSVC или MinGW.Он также говорит, что LoadLibrary должен возвращать 0, если DllMain возвращает FALSE, так что это может не быть фактическим объяснением.

Действительно ли DllMain вызывается как в MSVC, так и в версии MinGW, происходит ли что-то, если вы удалите комментарийвызов сообщения в нем?

Для получения дополнительной информации о DllMain, проверьте http://msdn.microsoft.com/en-us/library/ms682583(VS.85).aspx

Еще одна вещь, которая может быть интересна, если вы на самом деле вызываете функцию AiFunction из первого dll перед загрузкой второго,Если вы это сделаете, можете ли вы попробовать загрузить обе библиотеки DLL без вызова какой-либо функции между ними и посмотреть, работает ли она лучше?

Я подозреваю, что MinGW и MSVC упаковывают структуры ввода или вывода по-разному и что каким-то образом это несоответствие размера вызываетчасть памяти, которая будет повреждена при вызове AiFunction.Вы можете проверить это, сравнив результаты sizeof () для Output и Input внутри и вне dll, и посмотрите, совпадают ли они.Это не гарантирует, что это правильно, но если оно не совпадает, вы можете быть уверены, что что-то пойдет не так.

Наконец, я беспокоюсь, что возвращение Output может быть проблемой вна длительный срок, если вы начнете вводить виртуальные вызовы и тому подобное, поскольку они могут быть реализованы не совсем одинаково внутри MSVC и MinGW.Если вы храните его без виртуальных функций и тому подобного, все будет хорошо, если структура упаковки совпадает.

...