无法将全局变量从dll导入应用程序?

时间:2013-10-28 09:36:18

标签: c windows winapi dll global-variables

我有一个DLL

A.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-&gt;引用:我添加了A.dll它显示我编译器##错误错误1错误LNK2001:未解析的外部符号“__declspec(dllimport)char * ## * ReturnArr”(_ imp ?ReturnArr @@ 3PAPADA)“和”错误2致命错误LNK1120:1未解决## externals“

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

感谢

1 个答案:

答案 0 :(得分:0)

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

  1. 将A.LIB添加到配置属性中的“附加属性” - >链接器 - >输入
  2. 在Application.c中添加#pragma comment(lib,“a.lib”)
  3. 使DLL项目成为EXE项目和EXE项目的依赖项,并将Configuration属性 - > gt; linker-&gt; General“Link Library dependencies”设置为yes。
  4. 附注:

    1. 你确定你想要strcpy(ReturnArr [0],“str”); ?可能 的strcpy(ReturnArr [0],STR); (没有str附近的报价)
    2. 如果您静态链接到A,则不需要LoadLibrary和GetProcAddress。
    3. 你也可以只是压制_declspec(dllimport)char ** ReturnArr;
    4. MYPROC的typedef错误。 “function”的返回类型为void,而不是int
    5. 如果您希望EXE了解ReturnArr,只需将其作为函数的返回值!
    6. 您应该尝试解释您的具体操作