C 写入调用进程时dll调用出现问题

C 写入调用进程时dll调用出现问题,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>

我在一个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;
}
#包括
#包括
#包括
#包括
#包括
#包括
外部declspec(dllexport)int stdcall mjscall(char*cmd,DWORD wtime,char*stdoutfile,char*stderrfile);
typedef INT(*MJSCALL)(字符*,DWORD,字符*,字符*);
int main()
{
字符*a,*b,*c;
a=零;
b=零;
c=零;
德沃德aa=1;
int i;
HMODULE hLib;
MJSCALL添加;
hLib=LoadLibrary(“f3cucall.dll”);
if(hLib==NULL)
{
返回1;
}
ADD=(MJSCALL)GetProcAddress(hLib,“MJSCALL”);
if(ADD==NULL)
{
返回1;
}
(增补)(a、aa、b、c);
返回0;
}
“(添加)(a、aa、b、c);”是问题的根源。
有人能帮我吗?

我想你把两件事弄混了:
\uuuudeclspec(dllexport)
MSVC关键字从DLL导出函数(告诉链接器这样做),而
\uuudeclspec(dllimport)
从DLL导入函数。这是在加载时完成的,链接器将创建加载DLL和解析符号所需的所有代码。事实上,它向exe添加了一些代码,让操作系统加载DLL。您可以像使用任何普通内部函数一样,使用
\uu declspec(dllimport)
声明的函数

如果要使用这种方法,则需要DLL的lib文件,因为它包含链接器解析符号名的信息。它实际上并不包含代码,只包含链接器DLL上的这些信息。此外,您必须在函数声明之前使用magic_uudeclspec(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解析为uu declspec(dllexport)(在DLL项目中,在项目设置中定义MyDLL_导出)或u declspec(dllimport)(在所有使用DLL的项目中)。这样,DLL只需要一个头文件

调用DLL函数的另一种方法是使用LoadLibrary和GetProcAddress。这两个用于在运行时加载DLL。在加载时加载DLL与在运行时加载DLL之间的主要区别在于,您可以在运行时控制加载DLL,而在加载时加载DLL时,操作系统将执行此任务(例如,如果找不到DLL,则显示消息框,并且不运行进程)