【问题标题】:Cannot import Global variables from dll into application?无法将全局变量从 dll 导入应用程序?
【发布时间】:2013-10-28 09:36:17
【问题描述】:

我有一个 DLL

A.dll

这是啊.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 Error 1 error LNK2001: unresolved external symbol "__declspec(dllimport) char * ##* ReturnArr" (_imp?ReturnArr@@3PAPADA)”和“错误 2 致命错误 LNK1120: 1 unresolved ##externals”

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

谢谢

【问题讨论】:

    标签: c windows winapi dll global-variables


    【解决方案1】:

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

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

    旁注:

    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,就让它成为函数的返回值吧!

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

    【讨论】:

    • 好吧,我必须用 Loadlibrary 和 GetProcAddress 来做这件事。你能建议我用那个方法吗
    • @D.A.如果要手动链接库,则不能使用 dllimport 指令。您必须使用GetProcAddress 来检索ReturnArr 的地址。
    • @D.A.Danekhail 你还需要帮助吗?
    猜你喜欢
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多