我有一个DLL

dll文件

这是A.h

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef __cplusplus
#define DLL_EXPORT extern "C" __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllexport)
#endif

DLL_EXPORT void function();
DLL_EXPORT char ** ReturnArr;


这是A.c

void function()
{
char *str = "hello";
char *str1 = "how are you?";
ReturnArr = (char **)malloc(sizeof(char*) * 2);
for(;j<2;j++)
{
ReturnArr[j] = (char *) malloc(256);
if(NULL == ReturnArr[j])
break;
}
strcpy(ReturnArr[0],"str");
strcpy(ReturnArr[1],"str1");
}


现在我有将使用dll的Application.c

#include <windows.h>
#include <stdio.h>

typedef int (__cdecl *MYPROC)(LPWSTR);

_declspec(dllimport) char ** ReturnArr;

int main( void )
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
int a = 0;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

// Get a handle to the DLL module.

hinstLib = LoadLibrary(TEXT("A.dll"));

// If the handle is valid, try to get the function address.

if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "function");

// If the function address is valid, call the function.
if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
(ProcAdd) (L"Message sent to the DLL function\n");
printf("%s",Returnarr[0]);
}

fFreeResult = FreeLibrary(hinstLib);
}

// If unable to call the DLL function, use an alternative.
if (! fRunTimeLinkSuccess)
printf("Message printed from executable\n");

return 0;

}


在Visual Studio CommonProperties-> references中:我添加了一个A.dll,向我显示了编译器## error错误1错误LNK2001:无法解析的外部符号“ __declspec(dllimport)char * ## * ReturnArr”(_imp?ReturnArr @@ 3PAPADA) “错误2致命错误LNK1120:1个未解决的## externals”

我如何才能实际导出全局变量并在我的应用程序中使用,告诉我一种如何在我的应用程序中实际将ReturnArr打印为全局变量的方法

谢谢

最佳答案

如果希望链接器解析ReturnArr导入的变量,则必须将A.LIB添加到链接过程中。有几种方法可以做到这一点。


将A.LIB添加到配置属性->链接器->输入中的“其他依赖项”
在Application.c中添加#pragma comment(lib,“ a.lib”)
使DLL项目成为EXE项目的依赖项,并在EXE项目中将“配置属性”->“链接器”->“常规“链接库依赖项””设置为“是”。


旁注:


您确定要strcpy(ReturnArr [0],“ str”); ?可能
strcpy(ReturnArr [0],str); (在str周围没有引号)
如果您静态链接到A,则不需要LoadLibrary和GetProcAddress。
您也可以限制_declspec(dllimport)char ** ReturnArr;
您的MYPROC的typedef错误。 “函数”的返回类型为void,而不是int
如果您希望EXE知道ReturnArr,只需使其成为函数的返回值即可!


您应该尝试解释您到底想做什么

10-06 15:06