我有一个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)
在Date.h
,Date.cpp
内的应用程序项目(.exe)中定义。
我已经尝试过做了什么:
为librarywrap项目添加了新的参考。 Project -> Properties -> Common -> Add New Reference
。选择“applicationProject”。
添加了其他包含目录:$(SolutionDir)\applicationProject
两个问题:
首先,这是合法/可实现的,我正在尝试做什么? DLL链接到应用程序项目,而通常它应该是其他方式 - 应用程序链接到DLL。假设我有两个应用项目(.exe)&amp; (.exe)可以将一个链接到另一个吗?
第二,如果第一个问题的答案是肯定的,我应该添加/更改哪些内容才能使其正常工作?
非常感谢!
尼古拉斯
答案 0 :(得分:1)
从技术上讲,有可能使DLL从另一个模块调用所有需要的函数(甚至可以从.exe文件中调用它们 - LoadLibrary可以这样做),但这将是一个巨大的痛苦:你必须明确地导出所有需要的方法在.EXE中(就像导出DLL函数一样)并将它们导入到DLL中。所以第一个问题的答案是肯定的,但如果DLL想要使用EXE中的大量入口点,那么可能它不是最好的选择。
我建议采用不同的方法:为.exe(应用程序)和.dll项目提供通用代码库。然后,您将能够通过运行应用程序来测试代码,并通过DLL使用其他应用程序的功能(DLL将包含所有必需的代码本身)。