c - MS VS 2008 中 __declspec(dllimport) 的用法

标签 c visual-c++

假设我们在 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/

相关文章:

c++ - 如何使用指针从不同的函数访问局部变量?

visual-c++ - Inno Setup 如何检查系统上是否存在 MSVCR100.dll

android - Clang 和 Visual C++ 结构对齐兼容性问题

我能否找出我包含在我的 C 程序中的库实际被使用了?

c - 从c中的文件的特定行读取整数

c - 如何使用 C 从输入短语中获取单词,然后按字母顺序获取第一个和最后一个单词?

Android NDK 限制?

visual-c++ - openCV 中的物体检测

winapi - 在 Windows 7 上安装 PCA 兼容性故障排除 - "This program might not have installed correctly”

c++ - 具有类型名称的矩阵总和