能力值:
( LV5,RANK:60 )
|
-
-
2 楼
extern ULONG Var.
|
能力值:
( LV5,RANK:60 )
|
-
-
3 楼
cpp文件里直接弄变量,h文件里就 extern ULONG Var.这样声明就直接能用了.
|
能力值:
( LV4,RANK:50 )
|
-
-
4 楼
我的代码只有.h,没有cpp,所以不行
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
static
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
原来也是static,前段时间才知道,误解了static的含义,不能使用,所以来求办法
|
能力值:
( LV5,RANK:70 )
|
-
-
7 楼
原来还有这种没有cpp的方法,多文件编译时应该很复杂
|
能力值:
( LV5,RANK:70 )
|
-
-
8 楼
#pragma once
不知道管不管用
|
能力值:
( LV4,RANK:50 )
|
-
-
9 楼
不行的……
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
class PP
{
public:
static int ms_x;
}
__declspec(selectany) int PP::ms_x = 0;
|
能力值:
( LV5,RANK:70 )
|
-
-
11 楼
看样子是对的
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
static了之后,有多个cpp使用这个头文件,就有了多个互不相关的同名全局变量了
|
能力值:
( LV4,RANK:50 )
|
-
-
13 楼
就是这样 ,所以我去static后,面临问题了,看大家有解决办法不
|
能力值:
( LV4,RANK:50 )
|
-
-
14 楼
static解决不了问题,还会导致错误,多份同名变量
|
能力值:
( LV9,RANK:210 )
|
-
-
15 楼
#define Param0 0
#define Param1 4
#define Param3 8
_declspec(naked) VOID Init()
{
VirtualAlloc(NULL, 1024, MEM_COMMIT, RAGE_READWRITE);
_asm
{
mov ebx, eax
}
}
这样ebx就用来保存你申请的内存首地址,所有的全局变量就用这块内存来保存
假如要使用Param0变量
_asm
{
mov eax, ebx
add eax, Param0
}
这样eax就是存放Param0的地址,取值即可,当然eax也可以换成你定义的局部变量,最后记得释放内存即可
这样比较麻烦,方面的话可以用宏,一般来说程序不会用到ebx指令,即使一些API用到也会在调用完后恢复,当然某些程序要不遵守规则那也没办法
|
能力值:
( LV4,RANK:50 )
|
-
-
16 楼
不复杂啊
好比我写的是个sdk,人家只需要include就行了,不需要增加cpp,不需要添加lib,使用很简单的
只不过我的实现里需要用到全局变量,才出现了难题,解决这个就ok了
|
能力值:
( LV4,RANK:50 )
|
-
-
17 楼
工程一大,东西就多,你这方法貌似增加工作量很大呀
还有,全局变量,当然会在多个函数中被使用,ebx就已经被废啦,所以你这方法,应该行不通
|
能力值:
( LV9,RANK:210 )
|
-
-
18 楼
还一种方法就是利用进程的共享内存,0x7FFE0000这个是起点,任何程序都可以用,把你的全局变量保存在这里,要用的时候加上0x7FFE0000就可以得到你全局变量的指针,然后取值即可,当然这种方法要注意没有其他人用共享内存,但好像除了一些特殊的程序会用之外一般没人用。
#define cParam0 0
#define cParam1 4
#define cParam2 8
Addr_Param0 = 0x7FFE0000 + cParam0;
*Addr_Param0 = 5;
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
这问题微软都解决不了
MFC的例子里,app对象都是用extern声明在头文件里,然后在cpp里定义.
所以楼主你的所有文件都做成h文件,其实是很不好的习惯.
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
#include "boost/noncopyable.hpp"
template <typename T>
struct Singleton : public boost::noncopyable
{
struct object_creator
{
object_creator(){ Singleton<T>::GetInstance(); }
inline void do_nothing()const {}
};
static object_creator create_object;
public:
typedef T object_type;
static object_type& GetInstance()
{
static object_type obj;
create_object.do_nothing();
return obj;
}
};
template <typename T>
typename Singleton<T>::object_creator
Singleton<T>::create_object;
===============================
xxx.h
class CXXX: public Singleton<CXXX>
{
}
#define qxxx CXXX::GetInstance()
|
能力值:
( LV4,RANK:50 )
|
-
-
21 楼
嗯,其实要解很容易的,只要在变量和函数前加个关键字,表示这个是唯一的就行了,应该不是ms不想解吧,只是可能不是很必要吧
头文件的好处是别人使用起来方便,就像我们用std库一样,从来都是include,也不管它在哪,也不用添加cpp,使用者简单,
当然,我里面其实很复杂,做了很多事,但暴露给外面的,就很简单了
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
把定义声明都写在头文件里,不但全局变量有冲突,函数也会有冲突,这时候就要很小心的组合包含,在多文件交叉包含的时候最头疼.就算有#pragma once或者#ifndef这样的保护,也很难避免冲突.
而如果用h+cpp的方式,根本不用担心这种问题,头文件几乎可以随意包含.
|
能力值:
( LV4,RANK:50 )
|
-
-
23 楼
你没有全局变量哦,你这个应该是模板吧
|
能力值:
( LV9,RANK:210 )
|
-
-
24 楼
多个函数引用是没关系的,ebx不是用来保存你的全局变量,而是存放你全局变量内存的指针,要获取你的全局变量还必须加上偏移,使用的时候ebx是不变的,所有函数用的ebx都是同一个值,这里ebx就相当于一个特权寄存器一样了。这种方法怕是用汇编写的代码,里面用了ebx这个寄存器,但又不守规则的不保存并恢复,像微软的API里面如果要用ebx是必须前push ebx,用完后再pop ebx的,所以不会改变ebx的值。
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
|
|
|