0

假设我们有: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),但我不知道如何使用它。请帮我解决一下这个。我被这个问题困扰了很多天。

非常感谢你。

4

2 回答 2

1

首先,默认情况下,不会从 DLL 导出任何函数。您必须使用 .map 文件或 .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 中调用。不需要该表,除非您的其他代码使用它。

于 2012-05-01T21:23:35.660 回答
0

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

于 2012-05-02T20:44:55.843 回答