C++ C++;从C++;。exe

C++ C++;从C++;。exe,c++,dll,dllexport,C++,Dll,Dllexport,使用VisualStudio17 我有一个C++ .exe,另一个项目是用同一个解决方案编写的DLL。 我打算使用DLL项目链接到我的C++ .exe应用程序,其中dll能够引用我的C++ .exe项目中的类和函数。p> 当我构建解决方案时,DLL项目需要连接到创建的C++ .Object对象。在没有复杂代码的情况下,我能用C++的可执行文件中的函数吗? 最好的 Ben这不需要使代码复杂化(除了通常从DLL导出函数之外) 我怀疑您当前的问题主要是与构建环境有关,但是让我们举一个快速的例子,说明如

使用VisualStudio17

<>我有一个C++ .exe,另一个项目是用同一个解决方案编写的DLL。 我打算使用DLL项目链接到我的C++ .exe应用程序,其中dll能够引用我的C++ .exe项目中的类和函数。p> 当我构建解决方案时,DLL项目需要连接到创建的C++ .Object对象。在没有复杂代码的情况下,我能用C++的可执行文件中的函数吗? 最好的
Ben

这不需要使代码复杂化(除了通常从DLL导出函数之外)

我怀疑您当前的问题主要是与构建环境有关,但是让我们举一个快速的例子,说明如何为您正在尝试做的事情工作(测试)代码

下面是带有导出函数的超级简单可执行文件的代码:

#include <stdio.h>
#include <conio.h>

extern "C" {
    void __declspec(dllexport) foo() {
        printf("in foo\n"); 
    }
}

int main() {
    getch();
}
我们可以非常正常地构建可执行文件,除非我们必须确保它在DLL中使用标准库(否则它的标准库将无法正确初始化,因此无法工作):
cl/MD trash9.cpp

然后我们有DLL的代码

#include "trash9.h"
#include <iostream>

extern "C" {
    void __declspec(dllexport) bar() {
        printf("in bar\n");
        foo();
        printf("back in bar\n");
    }
}

void DllMain() {}
DLL还需要使用DLL中的标准库,因此我们将其构建如下:
cl/MD/LD trash8.cpp trash9.lib
/MD
表示它应该使用DLL中的标准库,
/LD
表示它应该创建一个可执行文件(而不是默认的可执行文件)

最后,这里有一个可执行文件,它使用
bar

#include "trash8.h"

int main() { 
    bar();
}
我们可以这样构建:
cl/mduse\u bar.cpp trash8.lib

当我们运行它时,我们得到了您所期望的:

in bar
in foo
back in bar

这只剩下一个障碍:让VisualStudio同意做您想做的事情。我的直接反应是,首先要做的是将可执行文件放在一个项目中,将DLL放在第二个项目中,并且(如果您正在处理)将使用DLL的可执行文件放在第三个项目中,从第二个项目引用到第一个项目,从第三个项目引用到第二个项目。

通常,.DLL导出.exe可以使用的函数。反之亦然。。。问:你有机会破解“共享函数”,把它们放在.dll中,这两个都可以使用.exe的。我理解这是典型的方法,但是我试图用DLL项目作为我的C++ .exe的包装库,这样我就可以把它们导出到Excel中。您所说的共享函数是什么意思?您始终可以从()重写所有内容您正在寻找的那种.exe过去被称为“进程外组件”。您可以通过共享源文件共享编译时代码;您可以通过共享.dll来共享运行时代码,并且可以将现有代码重构为.dll,使其可在运行时共享。以下是您的选择:)Q:您到底想“导入Excel”什么?如果您的DLL使用可执行文件的导出,那么只有此可执行文件才能使用DLL。这一切都假定OP有其.exe中的原始代码要修改。如果他真的。。。那么就不需要修改和重建.exe。。。。也不需要他从.exe“导入功能”的“wrapper.dll”。根据OP所说的,听起来“理想”的解决方案是直接将相关代码重构成一个新的.dll。保罗4:不太可能。如果他的可执行文件已经在DLL中使用了标准库(这是很常见的),他根本不需要重建它。只有当它静态链接标准库时,才需要重新构建(甚至可能不需要,这取决于他关心使用的函数中的内容)。一个新的DLL无疑是理想的,但是一个包装器可以很容易地节省大量的工作。
#include "trash8.h"

int main() { 
    bar();
}
in bar
in foo
back in bar