假设我们在MS VS 2008中有:mysolution.sln,据说我们有2个项目:
1) project1.vcproj - 这里我们有project1_file1.cpp,我们在其中定义了函数:
doSomething(){
...
}
2) project2.vcproj - 说,这里我们有project2_file1.h和project2_file1.c。我想在project2_file1.c中实现的是这样的,其中:
myJumpTable_t myJumpTable = {
doSomething
};
我知道我们必须在某处定义一个结构:
typedef struct _myJumpTable_t {
void (*doSomething)();
}myJumpTable_t;
但我不确定,必须在哪里声明?我也知道我们必须使用__declspec(dllimport),我不知道如何使用它。请帮我解决一下这个。我很多天都坚持这个问题。
提前非常感谢你。
答案 0 :(得分:1)
首先,默认情况下,不会从DLL导出任何函数。您必须使用.map文件或__declspec(dllexport)
手动导出它们。
您从DLL导入的任何内容必须以与它只是程序的正常部分相同的方式定义,除非声明必须以__declspec(dllimport)
开头。这通常在头文件中完成,头文件是DLL项目文件的一部分,并且在编译DLL时会选择__declspec(dllexport)
(除非您使用.map文件),并在编译时__declspec(dllimport)
EXE
为了保持这个简单,我不会坚持这个建议。
//This is exporting the function from the DLL so that it can be found
__declspec(dllexport) void doSomething() {
...
}
//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;
myJumpTable_t myJumpTable = {
&doSomething //& symbol here is optional, but good practice
};
这是您的原始代码,但请注意,您可以在声明后直接在EXE中调用doSomething
。除非您的其他代码使用该表,否则不需要该表。
答案 1 :(得分:0)
您是在构建将使用此DLL的DLL和应用程序,还是两个项目都只是可执行模块,而您正在尝试重用代码?