全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1785
推到 Plurk!
推到 Facebook!

求救。CreateFileMapping失敗,服務與視窗資料傳遞。

尚未結案
nady
一般會員


發表:8
回覆:6
積分:2
註冊:2002-11-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-15 17:13:43 IP:211.78.xxx.xxx 未訂閱
各位前輩好 小弟目前遇到一個很嚴重的問題。 因為我的程式是一個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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-27 09:42:54 IP:211.78.xxx.xxx 未訂閱
後來找到答案了 原來是很複雜的安全性問題...確實的原因我也不甚了解 不過知道的是...再呼叫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");    我也忘了是摘錄自網路上哪未前輩的作品,反正設定上述的程式碼,就可以使用了。 真是感謝網路上這麼多前輩高手的奉獻
系統時間:2024-06-26 9:35:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!