У меня есть одно решение Visual Studio, которое состоит из двух проектов Win32: 1) приложение (.exe) 2) функции оболочки (.dll).
Решение находится на стадии создания прототипа, поэтому все классы / функциональные возможности реализованы в проекте (.exe) — грязный, но быстрый и простой для отладки / тестирования.
Я начал писать оболочку DLL, чтобы «поиграть» с функциональностью в MSExcel / VBA и столкнулся с ошибкой компоновки
error LNK2019: unresolved external symbol "public: __thiscall Date::Date(int,int,int)" (??0Date@@QAE@HHH@Z) referenced in function addNumbers
Заголовочный файл DLL:
#ifdef LIBRARYWRAP_EXPORTS
#define LIBRARYWRAP_API __declspec(dllexport)
#else
#define LIBRARYWRAP_API __declspec(dllimport)
#endif
LIBRARYWRAP_API int _stdcall addNumbers(int a, int b);
Исходный файл DLL:
#include "..\applicationProject\Date.h"
class Date;
LIBRARYWRAP_API int _stdcall addNumbers(int a, int b){
Date dummyDate(12,1,2014); // <- Linker error LNK2019.
return (a+b);
}
Учебный класс Date
и конструктор Date::Date(int,int,int)
определены в проекте приложения (.exe) в пределах Date.h
, Date.cpp
,
Что я уже пытался сделать:
для проекта librarywrap добавлена новая ссылка. Project -> Properties -> Common -> Add New Reference
, Выбранный «applicationProject».
добавлены дополнительные каталоги включения: $(SolutionDir)\applicationProject
Два вопроса:
Во-первых, это законно / достижимо, что я пытаюсь сделать? DLL ссылается на проект приложения, тогда как обычно это должно быть иначе — ссылки приложения на DLL. Гипотетически, если у меня есть два проекта приложений (.exe) & (.exe) можно будет связать одно с другим?
Во-вторых, если ответ на первый вопрос положительный, что я должен добавить / изменить, чтобы он работал?
Спасибо большое!
Николас
Технически, можно сделать DLL для вызова всех необходимых функций из других модулей (даже из .exe — LoadLibrary может сделать это), но это будет большой болью: вам придется явно экспортировать все необходимые методы в. EXE (так же, как вы экспортируете функции DLL) и импортируйте их в свою DLL. Таким образом, ответ на первый вопрос — да, но если DLL хочет использовать много точек входа из EXE-файла, то, вероятно, это не лучший вариант.
Я бы предложил другой подход: иметь общую кодовую базу для проектов .exe (приложение) и .dll. Затем вы сможете протестировать свой код, запустив приложение, и использовать функциональные возможности других приложений через DLL (DLL будет содержать весь необходимый код сам по себе).
Других решений пока нет …