0

我有一个 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.hDate.cpp.

我已经尝试做的事情:

  1. 为 librarywrap 项目添加了新的参考。Project -> Properties -> Common -> Add New Reference. 选择“应用项目”。

  2. 添加了额外的包含目录:$(SolutionDir)\applicationProject

两个问题:

首先,我正在尝试做的事情是合法/可实现的吗?DLL 链接到应用程序项目,而通常它应该是其他方式 - 应用程序链接到 DLL。假设我有两个应用程序项目(.exe)和(.exe),是否可以将一个链接到另一个?

其次,如果第一个问题的答案是肯定的,我应该添加/更改什么以使其工作?

非常感谢!

尼古拉斯

4

1 回答 1

1

从技术上讲,可以制作一个 DLL 来从其他模块调用所有需要的函数(甚至从 .exe 模块调用 - LoadLibrary 可以做到这一点),但这将是一个巨大的痛苦:您必须在 . EXE(就像您导出 DLL 函数一样)并将它们导入您的 DLL。所以第一个问题的答案是肯定的,但是如果 DLL 想要使用来自 EXE 的大量入口点,那么它可能不是最佳选择。

我建议采用不同的方法:为 .exe(应用程序)和 .dll 项目使用通用代码库。然后,您将能够通过运行应用程序来测试您的代码,并通过 DLL 使用其他应用程序的功能(DLL 将包含所有必要的代码本身)。

于 2013-03-31T15:10:07.137 回答