2014年4月14日 星期一

Services程式與一般程式之間共享資訊

主要是透過Share Memory的方式建立可以共同存取的記憶體
這樣A可以寫入資訊讓B去讀取, 彼此溝通

Process A:

HANDLE hFile;
char writeBuffer[128]={0};
LPCTSTR pBuf;          
char szFileName[]="Global\\Test";
SECURITY_ATTRIBUTES security;
ZeroMemory(&security, sizeof(security));
security.nLength = sizeof(security);
ConvertStringSecurityDescriptorToSecurityDescriptor(
         "D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GR;;;IU)",
         SDDL_REVISION_1, &security.lpSecurityDescriptor,NULL);

hFile = CreateFileMapping((HANDLE)0xFFFFFFFF,&security,PAGE_READWRITE,0,sizeof(writeBuffer),szFileName  );

pBuf = (LPCTSTR)MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,sizeof(writeBuffer));
strcat((char*)pBuf,"This is a Share Memory!!");
CloseHandle(hFile);


Process B:

char szFileName[]="Global\\Test";
Char writeBuffer[128]={0};
LPCTSTR pBuf;
HANDLE hFile;
hFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, szFileName);
pBuf=(LPCTSTR)MapViewOfFile(hFile,FILE_MAP_ALL_ACCESS,0,0,sizeof(writeBuffer));
if(strlen(pBuf))
    Edit1->Text = pBuf;
CloseHandle(hFile);



特別要注意的是紅色部分是 Service 要加入的部分, 透過這樣設定DACL授予普通用戶讀取權限的記憶體共享, 如果需要寫入的話, 要將 GR改成GWGR, 只是, 請注意, 這樣是不安全的!!

參考網頁:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx
http://stackoverflow.com/questions/898683/how-to-share-memory-between-services-and-user-processes
http://msdn.microsoft.com/en-us/library/windows/desktop/aa376401(v=vs.85).aspx