C语言 无法将全局变量从 dll 导入到应用程序中



我有一个DLL

答.dll

这是啊

#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;

这是交流电

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 的应用程序

#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 functionn"); 
printf("%s",Returnarr[0]);
}
fFreeResult = FreeLibrary(hinstLib); 
} 
// If unable to call the DLL function, use an alternative.
if (! fRunTimeLinkSuccess) 
printf("Message printed from executablen"); 
return 0;
}

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

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

谢谢

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

  1. 将 A.LIB 添加到配置属性->链接器->输入中的"其他依赖项"
  2. 在应用程序中添加 #pragma 注释( lib, "a.lib" )
  3. 使 DLL 项目成为 EXE 项目和 EXE 项目中的依赖项,并将"配置属性->链接器->常规"链接库依赖项"设置为"是"。

旁注:

  1. 你确定 yoy 想要 strcpy(ReturnArr[0],"str"); ?可能是strcpy(ReturnArr[0],str);(没有引号)
  2. 如果静态链接到 A,则不需要 LoadLibrary 和 GetProcAddress。
  3. 你也可以只压制_declspec(dllimport)字符**返回Arr;
  4. 你的 MYPROC 类型定义是错误的。"函数"的返回类型是 void,而不是 int
  5. 如果你想让 EXE 知道 ReturnArr,只需让它成为函数的返回值!

你应该试着解释你到底想做什么

相关内容

  • 没有找到相关文章

最新更新