這裏是一個益智遊戲,我找不到答案(在這裏SO或其他網站)。我是一個新手,但我試圖快速學習。MS VS 2010入口點程序不能在更改後找到過程名稱
我需要我的DLL入口點過程的名稱從
int subCreatePipe()
改變
int subCreateNewPipe()
但是,當我這樣做,啓動程序死掉。
特定的錯誤是:
「過程入口點subCreateNewPipe不能設在動態鏈接庫myPipe.dll」
我上運行的設置是:
- Windows 7
- MS Visual Studio 2010
- C++的Win32
- 未受管(沒有CLI)
MBCS
- 我創建了一個 「myPipe.dll」(使用上述的設置)來測試我創建一個DLL和打開一個管道的能力。
- 我創建了一個「TestPipe.cpp」(使用上面的設置,但與Win32控制檯),所以我可以運行一個程序,將鏈接到DLL並顯示一些結果給我。
- (我也有其他的程序,將送東西給管。)
現在,這裏的踢球者:
- 我創建了一個它稱之爲
int subCreatePipe()
程序的DLL。 - 我編譯成功。
- 我將發佈文件移動到我的
TestPipe
項目「Lib」子文件夾中。 在TestPipe.cpp我有一個行調用的程序:
x = subCreatePipe();
我編譯TestPipe.cpp並運行發佈的「TestPipe.exe」,它運行完美。 它找到subCreatePipe的入口點。
但我需要的DLL程序重命名爲subCreateNewPipe
堅持命名約定,我沒有控制權。
- 我myPipe.dll程序重命名爲
int subCreateNewPipe()
- 我成功編譯它。
- 我將發佈文件移到我的TestPipe項目「Lib」子文件夾中。 (刪除舊文件)
在TestPipe.cpp我改變調用的程序:
x = subCreateNewPipe();
我編譯TestPipe.cpp並運行發佈的「TestPipe.exe」和它死(與上面給出的錯誤)。
如果我回去並將DLL過程名稱更改爲subCreatePipe
,它將再次運行。如果我回去並將其更改爲subCreateNewPipe
,它會再次死亡。我所做的唯一不同的是改變入口點過程名稱。
所以我的問題是:
- 有沒有辦法在VS 2010中重新命名一個入口點過程?
- 即使我將它留空,我是否應該使用
DLLMain()
? (這看起來很糟糕) - 有一些隱藏的開關我失蹤了嗎?
- Linker真的在做什麼?
- 是否有名稱正在繼續?
- 還是在第一次編譯項目後還有別的東西無法更改?
一些其他的東西我想(仍然給出了相同的結果「的第一種方式工作」,而是「第二種方式失敗」):
我嘗試使用
__stdcall
int __stdcall subCreatePipe() // works int __stdcall subCreateNewPipe() // doesn't work
我嘗試使用
__declspec(dllexport)
ifdef X_EXPORT_FLAG #define DLL_IMPORT_EXPORT __declspec(dllexport) else #define DLL_IMPORT_EXPORT __declspec(dllimport) endif X_EXPORT_FLAG int __stdcall subCreatePipe() // works X_EXPORT_FLAG int __stdcall subCreateNewPipe() // doesn't work
我也嘗試使用.DEF文件來定義鏈接器的過程名稱。
int subCreatePipe() // works int subCreateNewPipe() // doesn't work
(在所有的例子我改變TestPipe.cpp代碼來調用適當的程序名稱。)
如果你看不出來,我對試圖找出有點強迫症走出去,讓這個工作。
我現在要去創建一個新的Win32控制檯應用程序來調用DLL(我應該在24小時前完成的)。但是,我仍然很好奇爲什麼我無法更改入口點過程名稱。對於爲什麼無法完成,更好的編碼技術,或者如何解決這個鏈接器問題的任何見解都會受到歡迎。
如果我理解你的問題,你不應該使用術語「dll入口點過程」。 DLL入口點是加載程序在加載DLL時調用的,並且是一種相當先進的設置,很少需要與之混淆。你似乎在談論的是從應用程序調用的DLL導出。 –
這聽起來像應用程序正在查找一箇舊的DLL版本。確保更新的DLL位於應用程序將從中加載它的位置。 –
嗨邁克爾:)感謝您的回覆。我得到的錯誤信息是「... procedure Entry Point ...」,所以這就是我在描述中使用它的原因。我沒有觸及dll入口點的Configuration-> Linker-> Advanced選項。該設置保持空白。另外...我同意這聽起來像一箇舊的DLL可能是問題。但事實並非如此。我每次清除我的dll libray文件夾並複製到新的dll Release文件中。當我編譯原始程序名稱時...它起作用。當我嘗試更改原始程序名稱時,它不起作用。 ......我知道......它也讓我感到困惑。 – abraxascarab