[問題] 關於FARPROC及GetProcAddress的問題

看板C_and_CPP作者 (緣由天定分在人為)時間14年前 (2009/12/04 11:27), 編輯推噓10(10036)
留言46則, 4人參與, 最新討論串1/5 (看更多)
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) HINSTANCE hDLL = LoadLibrary(TEXT("libGLESv2")); FARPROC p2 = GetProcAddress(hDLL,"glCompileShader"); void (*p)(GLuint); p = (void (*) (GLuint)) p2; p(shader); hDLL有找到位址 但是p2卻是0x00000000 所以p就跟p2一樣 猜想可能是格式問題 但是不知道怎麼下手修改 希望得到的正確結果: 能抓到p2的位址 程式跑出來的錯誤結果: 存取違規(p=0x00000000) 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) VS2005 有問題的code: (請善用置底文標色功能) FARPROC p2 = GetProcAddress(hDLL,"glCompileShader"); 補充說明: 如果有什麼應該要提供的資訊 小弟沒有提供的 請各位前輩說一下 請謝 -- http://www.wretch.cc/blog/ZAS007 月下 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.165.212

12/04 11:32, , 1F
雖然LoadLibrary成功, 不過libGLESv2不用.dll嗎?_?
12/04 11:32, 1F

12/04 11:42, , 2F
話說, 要不要改用Link libGLESv2.lib, 然後不要用
12/04 11:42, 2F

12/04 11:42, , 3F
GetProcessAddress的方式, 直接呼叫glCompileShader().
12/04 11:42, 3F

12/04 12:18, , 4F
不用 好像預設就是找dll
12/04 12:18, 4F

12/04 12:20, , 5F
是在屬性那邊設定linker嗎@@? 如果直接讀libGLESv2.lib
12/04 12:20, 5F

12/04 12:20, , 6F
程式可以順利執行 可是現在必須使用這樣的方式去讀0.0
12/04 12:20, 6F

12/04 12:21, , 7F
對, 這樣就不用GetProcessAddress了, 理論上照GLES2裡的
12/04 12:21, 7F

12/04 12:21, , 8F
gl2.h裡的定義, 應該是直接link lib就可以用@_@"
12/04 12:21, 8F

12/04 12:24, , 9F
照理說用lib也比較符合spec的規範吧, 有什麼理由要直接
12/04 12:24, 9F

12/04 12:26, , 10F
因為 上面還多一個fprint的動作@@
12/04 12:26, 10F

12/04 12:27, , 11F
開.dll嗎@_@"
12/04 12:27, 11F

12/04 12:27, , 12F
剛發現我錯了, 找不到有說用.lib的段落....Orz
12/04 12:27, 12F

12/04 12:28, , 13F
多一個fprintf的動作?_?
12/04 12:28, 13F

12/04 12:29, , 14F
簡單的說 就是看執行過什麼API 然後output 0.0
12/04 12:29, 14F

12/04 12:30, , 15F
喔~~你也寫一個logger, 然後hook中間的API call list啊.
12/04 12:30, 15F

12/04 12:30, , 16F
12/04 12:30, 16F

12/04 12:34, , 17F
嗯嗯 所以才要這樣寫0.0 可是p2就抓不到...
12/04 12:34, 17F

12/04 12:37, , 18F
你用哪家的libGLESv2 ?_?
12/04 12:37, 18F

12/04 12:41, , 19F
POWER VR的
12/04 12:41, 19F

12/04 12:42, , 20F
GetProcAddress 是去輸出表找, 如果 libGLESv2 沒把該函試
12/04 12:42, 20F

12/04 12:42, , 21F
寫到輸出表也會找不到 (像是要加 dllexport 之類的)
12/04 12:42, 21F

12/04 12:44, , 22F
我用PowerVR的測, 就拿你一模一樣的code去跑是可以的.
12/04 12:44, 22F

12/04 12:44, , 23F
(Train2那個HelloTri的sample), 但是p()執行完會有ESP
12/04 12:44, 23F

12/04 12:45, , 24F
不正確的問題, 換句話說calling Convention可能不一致.
12/04 12:45, 24F

12/04 12:45, , 25F
如果用OPEN GLES2.0 programming guide的範例呢0.0?
12/04 12:45, 25F

12/04 12:45, , 26F
但是這樣一來, 我就不明白為什麼你Get不回來了說@_@"
12/04 12:45, 26F

12/04 12:46, , 27F
方便提供連結嗎?? 我這邊只有PowerVR的Demo/sample @_@"
12/04 12:46, 27F

12/04 12:46, , 28F
是說__stdcall跟__cdecl的差異嗎
12/04 12:46, 28F

12/04 12:47, , 29F
類似, 但是這是在已經Get到Address的情況, 可是你連Get
12/04 12:47, 29F

12/04 12:47, , 30F
都Get不到@_@"
12/04 12:47, 30F

12/04 12:48, , 31F
PE 的輸出表只有名稱, 跟呼叫慣例無關的, 不會因此取不到~
12/04 12:48, 31F

12/04 12:48, , 32F
另外, 函數應該有被export, 不然使用.lib link不用
12/04 12:48, 32F

12/04 12:49, , 33F
LoadLibrary的情況下也可以使用該函數嗎??
12/04 12:49, 33F

12/04 12:49, , 34F
mm, 同意f大說的, 先要能取到, 才看call conv的問題@_@"
12/04 12:49, 34F

12/04 12:52, , 35F
Call Conv的問題, 手上gl2.h查定義到底, 是__stdcall
12/04 12:52, 35F

12/04 12:53, , 36F
但是GetProcAddr回來是__cdecl, 想轉__stdcall還不給轉
12/04 12:53, 36F

12/04 12:53, , 37F
所以這邊Func Ptr call完有個stack爛掉的錯誤合理; 只是
12/04 12:53, 37F

12/04 12:53, , 38F
可以呀 但是要以fptr來轉
12/04 12:53, 38F

12/04 12:53, , 39F
不給強轉不知道怎麼修. 不過原po Get不回來就不明了@_@"
12/04 12:53, 39F

12/04 12:54, , 40F
用function pointer的格式轉看看
12/04 12:54, 40F

12/04 12:54, , 41F
啊~~是我宣告忘了改, 對不起我老是在耍笨....Q_Q~
12/04 12:54, 41F

12/04 12:55, , 42F
(ret_t (__stdcall*)(arglist...) )functionAddress
12/04 12:55, 42F

12/04 12:56, , 43F
gl這類的不知道會不會像w32那樣有W跟A的版本
12/04 12:56, 43F

12/04 12:57, , 44F
應該不會, GL只用char不用wchar的:)
12/04 12:57, 44F

12/04 13:01, , 45F
嗯嗯 感謝各位前輩的回應 小弟來去試試看
12/04 13:01, 45F

12/04 13:26, , 46F
好像沒有改p2那邊...0.0
12/04 13:26, 46F
文章代碼(AID): #1B6864X4 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1B6864X4 (C_and_CPP)