VC ++: Использование DLL в качестве «подпрограмм» - PullRequest
0 голосов
/ 16 марта 2011

Итак, я только что начал пробовать свои силы в эмуляции после многих лет откладывания и не зная, с чего начать, и мне удалось успешно написать свой первый эмулятор! Теперь я организую свой код так, чтобы я мог повторно использовать код для эмуляции других систем. Я играю с идеей иметь общий «обработчик платформы» внешнего интерфейса, который я скомпилирую в качестве исполняемого файла, в то время как я скомпилирую мой эмулированный системный код в dll, которые обработчик платформы будет использовать для определения того, что доступно, и создания экземпляров из него. , Это позволило бы мне разделить мой код на разные проекты и оставить возможность использовать более объемный интерфейс с большим количеством функций или упрощенной «только игрой» и делить одни и те же DLL-файлы между ними, а не принимать два разных решения.

Я знаю, как скомпилировать dll и исполняемые файлы, но я не знаю, как связать исполняемый файл с пользовательской dll таким образом, чтобы я мог создать экземпляр класса из него. Я даже не уверен, что то, что я пытаюсь сделать, технически возможно. Должны ли классы dll быть статичными? Я никогда не кодировал ничего подобного раньше и даже не делал много с помощью пользовательских библиотек, поэтому любая помощь или идеи будут оценены. Кстати, я использую Visual C ++ 2010. Заранее благодарим за любой совет, который может быть у кого-либо.

1 Ответ

0 голосов
/ 16 марта 2011

На самом деле вам не нужно делать много другого.Просто экспортируйте ваши классы из DLL, как вы делаете для функций.В вашем приложении включите заголовок и ссылку на сгенерированную библиотеку, как вы это обычно делаете.См. Эту страницу: http://msdn.microsoft.com/en-us/library/81h27t8c%28v=vs.80%29.aspx

Example.h

#ifdef DLL_EXPORT
#define EXPORT_API __declspec(dllexport)
#else
#define EXPORT_API __declspec(dllimport)
#endif

class EXPORT_API Example
{
public:
    Example();
    ~Example();

    int SomeMethod();
};

int EXPORT_API ExampleFuncion();

Example.cpp

#include "Example.h"

Example::Example()
{
    // construct stuff
}

Example::~Example()
{
    // destruct stuff
}

int Example::SomeMethod()
{
    // do stuff
    return 0;
}

int EXPORT_API ExampleFunction()
{
    return 0;
}

В своем проекте dll определите DLL_EXPORT и выполните сборку.Вы получите .lib и .dll вывод.В вашем основном проекте, где вы будете использовать dll, вам не нужно ничего делать, кроме как включить заголовок и ссылку на .lib.Не определяйте символ DLL_EXPORT в вашем основном проекте и убедитесь, что .dll - это то место, где ваше приложение может его найти.

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

...