Распространяемый компилятор - библиотеки DLL для MS Visual Studio

StackOverflow https://stackoverflow.com/questions/2284649

Вопрос

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

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

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

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

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

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

Я был бы очень признателен за обратную связь, спасибо!

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

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

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

-Майкл

Это было полезно?

Решение

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

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

Для получения дополнительной информации о DllMain ознакомьтесь http://msdn.microsoft.com/en-us/library/ms682583 (ПРОТИВ 85).aspx

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top