在MS VS 2008中使用__declspec(dllimport)

时间:2012-05-01 20:59:29

标签: c visual-c++

假设我们在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),我不知道如何使用它。请帮我解决一下这个。我很多天都坚持这个问题。

提前非常感谢你。

2 个答案:

答案 0 :(得分:1)

首先,默认情况下,不会从DLL导出任何函数。您必须使用.map文件或__declspec(dllexport)手动导出它们。

您从DLL导入的任何内容必须以与它只是程序的正常部分相同的方式定义,除非声明必须以__declspec(dllimport)开头。这通常在头文件中完成,头文件是DLL项目文件的一部分,并且在编译DLL时会选择__declspec(dllexport)(除非您使用.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
};

这是您的原始代码,但请注意,您可以在声明后直接在EXE中调用doSomething。除非您的其他代码使用该表,否则不需要该表。

答案 1 :(得分:0)

您是在构建将使用此DLL的DLL和应用程序,还是两个项目都只是可执行模块,而您正在尝试重用代码?