gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:03:54 25 4
gpt4 key购买 nike

我在一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com