想在DLL中管理一个全局动态链表,以便于多个应用程序可以访问,请高手指点下实现方法,
解决方案 »
- 创建MDICLIENT窗口//ccs.hWindowMenu = MAKEINTRESOURCE(IDR_MENU1);//为什么加不上菜单呢????
- *.lib是个东东的问题
- 采回的图像是16位的,我想把采回的图像先转换为12位的,再进行操作处理,我应该怎么做?
- 如何实现ListCtrl控件的隐藏列功能??
- 立即给分:如何判断一个bstr类型变量是否为空?如何取得其长度?
- 如何求一组数(36个数),使这组数的任意两个数的差不相等.
- 哪里可以载到好的关于dll的电子书
- 请问如何用c++语言来清屏
- #####如何把CSTRING的内容当作函数名来运行#####如何得到指定目录下所有DLL文件的文件名#####
- 请教有哪位大侠在广域网上试验成功多播MultiCast了?!!!!
- +++++++++++++++++ UDP的简单问题 +++++++++++++++
- 菜鸟刚学C++,求一SOCKET通信的完整代码,有客户,服务两个程序的,由于我这里只能上CSDN,希望大家帮我找一段代码
#pragma data_seg(".shlist")
static void *pListHead = NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shlist,RWS")
然后动态库中所有链表操作都基于该链表首部来完成
另外在动态库中通过创建全局的指定名称的信号量或互斥量来在多个应用程序的操作中实现同步
不能用CRITICAL_SECITON来同步。
因为是跨进程。。
我试了一下,没有达到在两个进程间共享的要求 不知道是不是写得有问题,请帮助分析一下.h文件
---------------------------------------------------
#define DLLExport _declspec(dllexport)
class CItem{
public:
int MsgID;
int iValue;
CItem *pNext;
} ;
class DLLExport CMsgDB{
public:
CMsgDB();
virtual ~CMsgDB();
public:
void AddItem(int iMsgID,int iValue);
const CItem* GetHead();
const CItem* GetRoot();
BOOL UpData(int iMsgID,int iValue);
int GetValue(int iMsgID);
CItem* FindItem(int iMsgID);
};
---------------------------------------------------
.CPP文件
---------------------------------------------------
#include "stdafx.h"
#include "MsgDB.h"#pragma data_seg(".shlist")
static CItem *pListHead = NULL;
static CItem *pListRoot = NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shlist,RWS")
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
CMsgDB::CMsgDB()
{
}
CMsgDB::~CMsgDB()
{}
void CMsgDB::AddItem(int iMsgID,int iValue)
{
CItem *tmpItem=new CItem();
tmpItem->iValue=iValue;
tmpItem->MsgID=iMsgID;
tmpItem->pNext=NULL;
if(pListHead==NULL){
pListHead=tmpItem;
pListRoot=pListHead;
}else{
((CItem *)pListRoot)->pNext=tmpItem;
pListRoot=tmpItem;
}}
const CItem* CMsgDB::GetHead()
{
return (CItem*)pListHead;
}const CItem* CMsgDB::GetRoot()
{
return (CItem*)pListRoot;
}
CItem* CMsgDB::FindItem(int iMsgID)
{
CItem *tmpItem;
if(pListHead==NULL){return FALSE;}
tmpItem=pListHead;
while(1){
if(tmpItem->MsgID==iMsgID) break;
if(tmpItem==pListRoot){tmpItem=NULL; break;}
tmpItem=tmpItem->pNext;
}
return tmpItem;
}BOOL CMsgDB::UpData(int iMsgID,int iValue)
{
CItem *tmpItem=FindItem(iMsgID);
if(tmpItem==NULL) return FALSE;
tmpItem->iValue=iValue;
return TRUE;
}
int CMsgDB::GetValue(int iMsgID)
{
CItem *tmpItem=FindItem(iMsgID);
if(tmpItem==NULL) return -1;
return tmpItem->iValue ;
}