|
|
发表于 2006-1-14 20:57:37
|
显示全部楼层
你的理解还是有一定偏差的,虽然动态链接库(DLL)在被不同的程序load的时候,使用的都是相同的代码,但是Window加载DLL和普通程序一样,使用了一个WriteOnCopy机制,就是当对当前进程的地址空间进行“读取”和“执行”操作的时候,使用的是相同的内存映射,当程序对内存进行“写”操作的时候,Windows就会把你要操作的那块内存“复制”到另一个区域,所以你改的内存只是对应于当前进程,而不会影响其他的进程,至于你的想法,在Windows中使用楼上所说的“共享”段来实现的,具体可以参照MSDN中,关于DLL的描述!
Post by waa
现在有多个程序都使用同一个链接库,而链接库中有一个静态变量作为累加的,那些程序里面取得的值要求不会重复。不知道怎么表达才好
dllfct.h
#ifndef _DLLFCT_H__
#define _DLLFCT_H__
#ifndef EXPORT
#ifdef BUILD_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif // #ifdef BUILD_DLL
#endif // #ifndef EXPORT
EXPORT int getSeq(void);
#endif // #ifndef _DLLFCT_H__
dllfct.c
#include <stdio.h>
#include "dllfct.h"
static int a = 0xAB;
EXPORT int getSeq(void)
{
return a++;
}
hello.c
#include <stdio.h>
#include "dllfct.h"
int main(void)
{
char k = '\0';
while (k != 'q')
{
printf("static value is: [%d]", getSeq());
k = getchar();
}
return 0;
}
编译:
gcc -c -DBUILD_DLL dllfct.c
gcc -shared -otst.dll -Wl,--out-implib,libtstdll.a dllfct.o
gcc -c -ohello.o hello.c
gcc -ohello.exe hello.o -L./ -ltstdll
然后同时运行多个hello.exe,但是每个程序所取得的值都是一样的。是不是我对链接库的理解错了? |
|