看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC2008 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) MFC 問題(Question): 請問是否有辦法load同一個dll檔,load儲存的記憶體位置是不同的? 補充說明(Supplement): 不好意思小弟上來請教一下各位先進關於dll的問題。 我對於dll檔案的觀念不是很清楚,如果問題太過基本還請各位指教。 我接手一個project要改,這個project要去load一個dll檔案來做事。 這個dll是要跟server連線取得資料,要做的工作全部都寫在dll裡面。 原作者將dll的function在project裡面以function pointer來呼叫。 project只是把UI畫出來,當user點選按鈕時判斷事件, 呼叫function pointer,指向dll內部真正實作的function。 現在這project要做的事是希望可以同時連好幾台server(Multi-Server)。 我的想法是如果不要動到這個dll最好, 有沒有辦法重複去load這個dll,放到不同的記憶體位址, 這樣我就可以分別對這些位址去做處理, 甚至把這些function pointer寫一個新的class包起來, 看要連幾台Server就new幾個class object,這樣就完成了。 但是我測試LoadLibrary("XXX.dll")兩次回傳的位址都是一樣的, 所以我猜想這樣做應該是不行的。 請問版上各位先進有沒有更好的作法呢? 感激不盡。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.251.208.202 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1446654673.A.042.html
LPH66: 你的觀念放錯邊了; 程式只有一份但跑它的人可以有很多個 11/05 00:55
LPH66: 你需要的是多執行緒 (multithread) 11/05 00:55
感謝您的指點,但我有點不太明白您的意思。 您的意思是說開MultiThread各自去load這個dll嗎? 我對dll不是很懂,用不同的Thread去load同一個dll,記憶體位置會不一樣嗎? 謝謝您的指點! ※ 編輯: Keitaro (111.251.208.202), 11/05/2015 01:57:07
LPH66: 所以我說你的觀念放錯邊了...一支程式要給許多人執行 11/05 02:16
LPH66: 並不代表程式就必須放在不同的位置 11/05 02:16
LPH66: 只要各人各自暫存的東西有分開即可, 程式本身可以只有一份 11/05 02:17
LPH66: 這正是多執行緒背後的觀念 11/05 02:19
LPH66: 也就是說, 你載入一次程式之後各個執行緒去執行它就可以了 11/05 02:19
LPH66: 這不論你的程式是不是 dll 都是一樣的 11/05 02:19
LPH66: 若你對多執行緒有點概念那應該能了解你的問題其實不是問題 11/05 02:21
LPH66: 因為有沒有使用 dll 的差別只在程式是從哪裡載入的而已 11/05 02:22
LPH66: 其他概念是相通的 11/05 02:23
您的意思是說我Load dll後儲存一個變數起來, 然後利用這個變數,開MultiThread去呼叫dll的function是嗎? 但我這dll問題在於, dll跟Server建立連線後的變數是寫死一個global變數(存在dll裡面)。 這個變數代表跟server連線的Socket。 即使我開MultiThread去對這個dll做存取, Socket是同一台NVR,這樣做不到Multi-Server的目的了。 再不改動dll的前提下,有更好的作法嗎? 謝謝! ※ 編輯: Keitaro (111.251.218.8), 11/05/2015 06:15:05
stupid0319: 寫成個別的獨立程式,然後再寫個介面整合就可以了 11/05 08:11
LPH66: 所以問題其實是在全域變數, 那這樣沒救, 你大概得改 dll 了 11/05 17:23
LPH66: 有全域變數的程式基本上不改寫沒什麼可能跑多執行緒 11/05 17:24
LPH66: 你可以搜尋一下 thread-safe 這個名詞 11/05 17:25
LPH66: 唔嗯, 回頭看了一下我樓上的推文, 那種做法也是可行 11/05 21:33
LPH66: (有點像 Google Chrome 背後運作的方式這樣) 11/05 21:33
LPH66: 這樣其實就不是 multi-thread 而是 multi-process 了 11/05 21:34
非常感謝以上兩位的建言。 今天跟BOSS討論了一下,如果直接改dll我有把握改的出來。 Multi-Process確實可以不改動dll的前提下達成我要的目的, 但是Multi-Process的溝通上我完全沒經驗...由於有deadline限制,我認命直接改dll了... 找時間在來學習一下Multi-Process的作法。 謝謝! ※ 編輯: Keitaro (111.251.218.8), 11/05/2015 21:38:21
LPH66: 這樣一來因為是 process, 資料空間確實各自獨立 11/05 21:36
LPH66: 各支子 process 會各有自己的那一份 global variable 11/05 21:37
LPH66: 這樣就能達成你的目的了 11/05 21:37
Killercat: global轉成一份可以duplicate的context即可 11/06 09:13
Killercat: 這算是改寫舊專案裡面前三名惱人的問題之一了.... 11/06 09:14
Killercat: 「三小,DLL裡面綁一堆global跟extern!」 11/06 09:14
EdisonX: 我想知道殺人貓的前三名是什麼 11/06 21:45
BlazarArc: 樓上+1 XD 11/06 23:13