假设我们在 MS VS 2008 中有:mysolution.sln,其中我们有 2 个项目:
1) 项目1.vcproj - 这里有project1_file1.cpp,其中定义了函数:
doSomething(){
...
}
2) 项目2.vcproj - 比如说,这里有project2_file1.h和project2_file1.c。我试图在 project2_file1.c 中实现的目标是这样的,其中:
myJumpTable_t myJumpTable = {
doSomething
};
我知道我们必须在某处定义一个结构:
typedef struct _myJumpTable_t {
void (*doSomething)();
}myJumpTable_t;
但我不确定,这必须在哪里声明?我也知道我们必须使用 __declspec(dllimport),我再次不确定如何使用它。请在这件事上给予我帮助。我被这个问题困扰了很多天。
提前非常感谢您。
最佳答案
首先,默认情况下,DLL 中不导出任何函数。您必须使用 .map 文件或 __declspec(dllexport)
手动导出它们。 .
从 DLL 导入的任何内容都必须以与程序正常部分大致相同的方式定义,但声明必须以 __declspec(dllimport)
开头。 。这通常在作为 DLL 项目文件一部分的头文件中完成,并且会选择 __declspec(dllexport)
编译 DLL 时(除非您使用 .map 文件),以及 __declspec(dllimport)
编译EXE时
为了保持简单,我不会坚持这个建议。
project1_file1.cpp
//This is exporting the function from the DLL so that it can be found
__declspec(dllexport) void doSomething() {
...
}
project2_file1.h
//This is where we declare the function so our code knows what it is
__declspec(dllimport) void doSomething();
typedef struct _myJumpTable_t {
void (*doSomething)();
}myJumpTable_t;
project2_file1.c
myJumpTable_t myJumpTable = {
&doSomething //& symbol here is optional, but good practice
};
这遵循您的原始代码,但请注意您可以调用 doSomething
声明后直接在 EXE 中。不需要该表,除非您的其他代码使用该表。
关于c - MS VS 2008 中 __declspec(dllimport) 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10404270/