[問題] Load dll問題請教

看板C_and_CPP作者 (動き出す時間...)時間10年前 (2015/11/05 00:31), 10年前編輯推噓8(8018)
留言26則, 5人參與, 最新討論串1/2 (看更多)
開發平台(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

11/05 00:55, , 1F
你的觀念放錯邊了; 程式只有一份但跑它的人可以有很多個
11/05 00:55, 1F

11/05 00:55, , 2F
你需要的是多執行緒 (multithread)
11/05 00:55, 2F
感謝您的指點,但我有點不太明白您的意思。 您的意思是說開MultiThread各自去load這個dll嗎? 我對dll不是很懂,用不同的Thread去load同一個dll,記憶體位置會不一樣嗎? 謝謝您的指點! ※ 編輯: Keitaro (111.251.208.202), 11/05/2015 01:57:07

11/05 02:16, , 3F
所以我說你的觀念放錯邊了...一支程式要給許多人執行
11/05 02:16, 3F

11/05 02:16, , 4F
並不代表程式就必須放在不同的位置
11/05 02:16, 4F

11/05 02:17, , 5F
只要各人各自暫存的東西有分開即可, 程式本身可以只有一份
11/05 02:17, 5F

11/05 02:19, , 6F
這正是多執行緒背後的觀念
11/05 02:19, 6F

11/05 02:19, , 7F
也就是說, 你載入一次程式之後各個執行緒去執行它就可以了
11/05 02:19, 7F

11/05 02:19, , 8F
這不論你的程式是不是 dll 都是一樣的
11/05 02:19, 8F

11/05 02:21, , 9F
若你對多執行緒有點概念那應該能了解你的問題其實不是問題
11/05 02:21, 9F

11/05 02:22, , 10F
因為有沒有使用 dll 的差別只在程式是從哪裡載入的而已
11/05 02:22, 10F

11/05 02:23, , 11F
其他概念是相通的
11/05 02:23, 11F
您的意思是說我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

11/05 08:11, , 12F
寫成個別的獨立程式,然後再寫個介面整合就可以了
11/05 08:11, 12F

11/05 17:23, , 13F
所以問題其實是在全域變數, 那這樣沒救, 你大概得改 dll 了
11/05 17:23, 13F

11/05 17:24, , 14F
有全域變數的程式基本上不改寫沒什麼可能跑多執行緒
11/05 17:24, 14F

11/05 17:25, , 15F
你可以搜尋一下 thread-safe 這個名詞
11/05 17:25, 15F

11/05 21:33, , 16F
唔嗯, 回頭看了一下我樓上的推文, 那種做法也是可行
11/05 21:33, 16F

11/05 21:33, , 17F
(有點像 Google Chrome 背後運作的方式這樣)
11/05 21:33, 17F

11/05 21:34, , 18F
這樣其實就不是 multi-thread 而是 multi-process 了
11/05 21:34, 18F
非常感謝以上兩位的建言。 今天跟BOSS討論了一下,如果直接改dll我有把握改的出來。 Multi-Process確實可以不改動dll的前提下達成我要的目的, 但是Multi-Process的溝通上我完全沒經驗...由於有deadline限制,我認命直接改dll了... 找時間在來學習一下Multi-Process的作法。 謝謝! ※ 編輯: Keitaro (111.251.218.8), 11/05/2015 21:38:21

11/05 21:36, , 19F
這樣一來因為是 process, 資料空間確實各自獨立
11/05 21:36, 19F

11/05 21:37, , 20F
各支子 process 會各有自己的那一份 global variable
11/05 21:37, 20F

11/05 21:37, , 21F
這樣就能達成你的目的了
11/05 21:37, 21F

11/06 09:13, , 22F
global轉成一份可以duplicate的context即可
11/06 09:13, 22F

11/06 09:14, , 23F
這算是改寫舊專案裡面前三名惱人的問題之一了....
11/06 09:14, 23F

11/06 09:14, , 24F
「三小,DLL裡面綁一堆global跟extern!」
11/06 09:14, 24F

11/06 21:45, , 25F
我想知道殺人貓的前三名是什麼
11/06 21:45, 25F

11/06 23:13, , 26F
樓上+1 XD
11/06 23:13, 26F
文章代碼(AID): #1MEZBH12 (C_and_CPP)
文章代碼(AID): #1MEZBH12 (C_and_CPP)