求救。CreateFileMapping失敗,服務與視窗資料傳遞。 |
尚未結案
|
nady
一般會員 發表:8 回覆:6 積分:2 註冊:2002-11-12 發送簡訊給我 |
各位前輩好
小弟目前遇到一個很嚴重的問題。
因為我的程式是一個Service服務和另一個AP視窗程式,需要有資料傳遞的功能。目前設計是利用Memory Share的CreateFileMapping共用mapping handle來分享資料。
我有寫過視窗程式對視窗程式的File Mapping,並沒有問題。
可是service跟一般的視窗程式就會有問題。
(我在service和一般的視窗程式中都有CreateFileMapping程式碼大概如下) hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1000, "mySMemory"); if (hFileMapping != NULL)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
MessageDlg("Mapping file already created!", mtError, TMsgDlgButtons() << mbOK, 0);
}
}
else
{
MessageDlg("Mapping file created error!", mtError, TMsgDlgButtons() << mbOK, 0);
} hEvent = CreateEvent(NULL, false,false,"myEvent"); if (hEvent != NULL)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
MessageDlg("Event already created!", mtError, TMsgDlgButtons() << mbOK, 0);
}
}
else
{
MessageDlg("Event created error!", mtError, TMsgDlgButtons() << mbOK, 0);
} 但是我發現,如果我先啟動Service,再啟動一般視窗程式。在啟動一般視窗程式的時候就會出現,"存取被拒"的錯誤訊息。
可是如果我先啟動一般視窗程式,再啟動Service。就可以正常的使用分享記憶體。
是不是因為CreateFileMapping的第二個參數 lpFileMappingAttributes 的問題呀??是不是因為Service的安全要求很高,所以不能向一般的用法傳入NULL採用預設值呀??
救命...
救命
|
nady
一般會員 發表:8 回覆:6 積分:2 註冊:2002-11-12 發送簡訊給我 |
後來找到答案了
原來是很複雜的安全性問題...確實的原因我也不甚了解
不過知道的是...再呼叫CreateFileMapping之前
必須先設定此Service的安全性 SECURITY_ATTRIBUTES SA_ShMem;
PSECURITY_DESCRIPTOR pSD_ShMem;
// Create a NULL security descriptor. This allows full access to the
// shared memory by user mode apps.
pSD_ShMem = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
if (pSD_ShMem == NULL)
{
// Do something on error...
} if (!InitializeSecurityDescriptor(pSD_ShMem, SECURITY_DESCRIPTOR_REVISION))
{
// Do something on error...
} if (!SetSecurityDescriptorDacl(pSD_ShMem, TRUE, (PACL)NULL, FALSE))
{
// Do something on error...
} SA_ShMem.nLength = sizeof(SA_ShMem);
SA_ShMem.lpSecurityDescriptor = pSD_ShMem;
SA_ShMem.bInheritHandle = TRUE;
// Be sure to free pSD_ShMem when your app terminates. // Create the shared memory...
hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, &SA_ShMem, PAGE_READWRITE, 0, 1000, "mySMemory"); 我也忘了是摘錄自網路上哪未前輩的作品,反正設定上述的程式碼,就可以使用了。
真是感謝網路上這麼多前輩高手的奉獻
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |