如何访问DLL中的全局变量

TCSS001 2015-04-08 09:51:29
看了下关于DLL的东西,涉及到了DLL的创建、调用。
按照教程并不难,但是在访问DLL全局变量的时候遇到了问题,虽然都说访问DLL全局变量不好,但是怎么也得写出来才行撒。


问题如下:
写了个简单的测试程序,Dll头文件:
#ifndef DLL_EX_H
#define DLL_EX_H

extern __declspec(dllexport) int g_iTest;
extern "C" __declspec(dllexport) void func();

#endif

Dll源代码:

#include<iostream>
#include<Windows.h>
#include"dll_ex.h"
__declspec(dllexport) int g_iTest;
BOOL APIENTRY DllMain(HANDLE hMudle, DWORD dwReason, void* lpR)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
g_iTest = 19;
std::cout << g_iTest << std::endl;
case DLL_PROCESS_DETACH:
std::cout << "this is dll" << std::endl;
break;
default:break;
}
return TRUE;
}

extern "C" __declspec(dllexport) void func()
{
std::cout << "this is func" << g_iTest << std::endl;
return;
}


主程序代码:
#include<iostream>
#include<Windows.h>
#include"dll_ex.h"
#pragma comment(lib,"dll_ex.lib")

__declspec(dllimport) int g_iTest;

void main()
{

// HINSTANCE hInst = ::LoadLibrary(TEXT("dll_ex.dll"));
// if (hInst == NULL)return;
// typedef void(*PF)();
// PF pf = (PF)GetProcAddress(hInst, "func");
// pf();
std::cout << g_iTest << std::endl;
func();
while (10);
// FreeLibrary(hInst);
return;
}

主要是测试使用。
.def文件代码

LIBRARY dll_ex.dll
EXPORTS
g_iTest DATA



按理说,这里在主程序中应该能够得到g_iTest的值,但是这里得到的值却是0,没法获得在DllMain中设置的19.
...全文
3027 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lujiafeng0203 2016-12-01
  • 打赏
  • 举报
回复
不是一个人的帖子;(,全局数组调用问题
sdghchj 2016-12-01
  • 打赏
  • 举报
回复
貌似主程序里#include"dll_ex.h"不对,一下子export,一下子import,乱!
Lujiafeng0203 2016-12-01
  • 打赏
  • 举报
回复
谢谢,你的回复。准备抽些时间研读一下 大致写了一段代码,编译能通过,但是好像赋不了值,代码如下: 在 globalarray.h文件中声明全局数组: extern double randomarray[]; 在dll .cpp中定义及初始化全局数组,及定义两个函数。 #include "globalarray.h" extern "C" { double randomarray[100] = {0.0}; void get_rand(); int __declspec(dllexport) APIENTRY AnotherFunction(v1,v2); } // get_rand()用于生成一组数字然后存放于全局数组中,然后在另外一个函数AnotherFunction中调用这个全局数组中的值,一直不成功,返回都是0.好像get_rand 函数没有运行赋值给全局数组。 void get_rand() { int i; srand(0); //设置随机数种子 for (i = 0; i <= 99; i++) { randomarray[i] = rand()%1000/1001.0; } } int __declspec(dllexport) APIENTRY AnotherFunction(v1,v2); { double t; t=randomarray[1]; }
赵4老师 2016-11-29
  • 打赏
  • 举报
回复
建议楼主通读MSDN中有关DLL开发和调试相关章节。
Lujiafeng0203 2016-11-28
  • 打赏
  • 举报
回复
接着问一下: 本人C++刚入门,对于 DLL,我要用全局变量(数组好,还是指针好?还是其它方式更好),在DLL中用一个函数生成3组随机数,这3组随机数可以被多个线程及进程调用,有好的方法吗? 这个生成函数也要写成全局的吗?生成函数如下,数组p[]用于保存生成的随机数。大神们能给个示例吗,谢谢 void get_rand(double p[],int n,int seed) { int i; srand(seed); //设置随机数种子 for (i = 0; i <= n; i++) { p[i] = rand(); } }
lm_whales 2016-05-27
  • 打赏
  • 举报
回复
对于,加载又卸载了的dll 其中的全局变量,具有不确定的特性 DLL卸载以后,全局变量就不存在了 再次加载未必是同一个全局变量,至少上次改变的值,这次未必能用
lm_whales 2016-05-27
  • 打赏
  • 举报
回复
DLL导出全局变量 有个问题 什么样的全局变量(进程内的,还是多个进程都可以访问的共享变量)?
jujiq 2016-05-23
  • 打赏
  • 举报
回复
用del文件不能成功导出吗?
TCSS001 2015-04-09
  • 打赏
  • 举报
回复
引用 1 楼 boxiaoliao 的回复:
http://bbs.csdn.net/topics/391013001 我刚好昨天问过这个问题
总算搞定了,多谢了。 顺便总结一下: 从dll导出全局变量不好,对于希望从DLL获取资源以实现资源共享的情景,最好是导出Get函数获得,这样操作起来更方便而且更安全。 对于必须使用Dll导出全局变量的情况,需要注意一下几点: 1,在Dll源文件定义全局变量,前面的修饰符跟函数一样,一般采用宏的方法。写出来一般是DLL_EX_API g_iTest =0的形式,切记要初始化一下,不然会报错!!! 2,在Dll头文件里还要再写一次,修饰方法同上,不需要初始化。 3,在主函数调用的时候只要include了响应头文件即可。 Dll学习到此已到一段落,基本的知识已经掌握了~~~~
boxiaoliao 2015-04-09
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/391013001 我刚好昨天问过这个问题

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧