c - 编写调用过程中dll调用的问题

标签 c dll

我在一个 dll 中定义了以下函数:

__declspec( dllexport ) int __stdcall
mjscall(char *cmd, DWORD wtime, char *stdoutfile, char *stderrfile )

我需要编写一个进程来调用上述函数。 我是第一次做,没有太多想法。 我写了下面的代码

#include <windows.h>
#include <windows.h>
#include <stdio.h>
#include <io.h>
#include <stdlib.h>
#include <limits.h>
extern __declspec( dllexport ) int __stdcall mjscall(char *cmd, DWORD wtime, char *stdoutfile, char *stderrfile );
typedef INT (*MJSCALL)    (char *,DWORD, char *, char *);
int main()
{

    char *a,*b,*c;
    a=NULL;
    b=NULL;
    c=NULL;
    DWORD aa =1;
    int i;
    HMODULE hLib;
    MJSCALL ADD;
    hLib=LoadLibrary("f3cucall.dll");
    if(hLib==NULL)
    {
        return 1;
    }
    ADD=(MJSCALL)GetProcAddress(hLib,"mjscall");
    if (ADD==NULL)
    {
        return 1;
    }

    (ADD)(a,aa,b,c);
     return 0;
}

“(ADD)(a,aa,b,c);”导致了问题。 有人可以帮我吗?

最佳答案

我认为你混淆了两件事:
__declspec(dllexport) MSVC 关键字从 DLL 导出函数(告诉链接器这样做),__declspec(dllimport) 从 DLL 导入函数。这是在加载时完成的,链接器将创建所有必要的代码来加载 DLL 并解析符号。事实上,它会在exe中添加一些代码来让操作系统加载DLL。您可以像使用任何普通内部函数一样使用通过 __declspec(dllimport) 声明的函数。

如果要使用此方法,则需要 DLL 的 lib 文件,因为它包含链接器解析符号名称的信息。它实际上并不包含代码,只包含链接器的 DLL 上的这些信息。此外,您必须在函数声明之前使用神奇的 __declspec(dllimport) 告诉链接器您要使用的函数位于 DLL 中。这就是为什么如果您想这样做的话,您需要为 DLL 提供 .lib 和头文件(包含这些声明)。当您更改 DLL 时,您应该重建使用该 DLL 的项目,因为 .lib 文件可能已更改。 您可以在 DLL 项目和从此 DLL 导入的项目中使用相同的头文件:

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

MYDLL_API void printMe(int);

MyDLL_API 被解析为 __declspec(dllexport)(在 DLL 项目中,您在项目设置中定义 MYDLL_EXPORTS)或 __declspec(dllimport)(在使用该 dll 的所有项目中)。这样,您只需要 DLL 的一个头文件。

调用 DLL 函数的另一种方法是使用 LoadLibrary 和 GetProcAdress。这两个用于在运行时加载DLL。在加载时加载 DLL 和在运行时加载 DLL 之间的主要区别在于,您可以对在运行时加载 DLL 进行一些控制,而操作系统将在加载时加载 DLL 时完成这项工作(例如,如果找不到 DLL,不运行该进程)。

关于c - 编写调用过程中dll调用的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3725128/

相关文章:

复制内部包含空值的字符串

c - 使用 rand() 在 C 中填充矩阵

Citrix 环境中 Java 进程将 CPU 占用率为 100%

c# - System.Messaging.dll 在 .Net Core 中不可用吗?

javascript - 在 ASP.NET MVC 项目中使用类库中的 Javascript 文件

c - 在第一列中使用函数名称的工具

c - 如何检测 utf8 中使用的字母表?

c - 函数指针 typedef 的前向声明

c++ - 错误 : the global scope has no GetUrl

visual-studio - 为什么 DLL 函数调用没有编译为相关的 CALL 指令