none
(VC 2005) DLL export 有問題??? RRS feed

  • 問題

  • Dear All,

     

    我是使用 VS 2005 , C++ , 去開發一支 Application , 並且呼叫外部 DLL 的 function 來使用.

    我目前的 Application 在 Loadlibrary 時, 是有成功的取得外部 DLL 的 Instance.

    但是當我要呼叫 GetProcAddress 去取得 DLL 裡 function 的 address 總是失敗.

    以下是我程式中的呼叫 DLL 的程式

    ==> 執行結果總是出現 , "Load OK" -> "Get Fail"

    我呼叫的方法應該沒錯吧???

     

    如果沒錯, 我則懷疑 DLL 是否有 export 我要的 function

    我將 DLL 檔, 用 DLL export viewer 去看 , 發現 SetHookHwnd 被 export 成為 ??SetHookHwnd@@ykqsj...

    想請問是否是因為 我要的 SetHookHwnd , 被 export 成 有點亂的名字 , 所以才導致我都無法正確的抓到 SetHookHwnd 的 address 嗎?

    如果是, 請問該如何解決?

     

    請問是否可以寫一個 Hook.def (Hook.dll 是我的 dll name) , 來明確的定義 export 的 function 名稱?

    如果可以的話, 是不是在我的 VS 2005 環境中 , 我的 porject 裡 , source file 再加入 Hook.def 就好?

    (這方法我也做了 , 但是還是一樣是 被 export 成 有點亂的名字, 是我加入 def 檔的方法有錯嗎?)

     

     

    PS. 我用 VS 2005 , C++ , Win32 Application , DLL , Export symbol 的範例

          標準範例 做出來 DLL 也是 被 export 成 有點亂的名字

     

    謝謝大家的幫忙

     

    BR,

    Wiles

     

     

     

    // 不好意思, 因為寫的程式目前不在手邊 , 所以以下的程式是我憑印象寫的

    // 如果有錯, 敬請見諒

     

    //==========================

    // Application

    //==========================

    SetHookHwnd SetHwndFunc;
    HookProc HookProcFunc;
     

    g_hHookDll = NULL;

    SetHwndFunc = NULL;


    g_hHookDll = LoadLibrary(TEXT("Hook.dll")));
    if(g_hHookDll == NULL)

    {

      MessageBox:Tongue Tiedhow( NULL, TEXT("load Fail"), TEXT("test"), NULL );

    }

    else

    {

      MessageBox:Tongue Tiedhow( NULL, TEXT("load OK"), TEXT("test"), NULL );

    }


    SetHwndFunc = (SetHookHwnd) ::GetProcAddress (g_hHookDll,"SetHookHwnd");
    if(SetHwndFunc == NULL)

    {

      MessageBox:Tongue Tiedhow( NULL, TEXT("Get Fail"), TEXT("test"), NULL );

    }

    else

    {

      MessageBox:Tongue Tiedhow( NULL, TEXT("Get OK"), TEXT("test"), NULL );

    }

     

     

     

    //==========================

    // def

    //==========================

    EXPORTS
        SetHookHwnd

     

    //==========================

    // VS 2005 , C++ , Win32 Application , DLL , Export symbol 的範例

    // 標準範例 做出來 DLL 也是 被 export 成 有點亂的名字

    //==========================

    // DLLTest.cpp

    //==========================

    // dlltest.cpp : 定義 DLL 應用程式的進入點。
    //

    #include "stdafx.h"
    #include "dlltest.h"


    #ifdef _MANAGED
    #pragma managed(push, off)
    #endif

    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
          )
    {
     switch (ul_reason_for_call)
     {
     case DLL_PROCESS_ATTACH:
     case DLL_THREAD_ATTACH:
     case DLL_THREAD_DETACH:
     case DLL_PROCESS_DETACH:
      break;
     }
        return TRUE;
    }

    #ifdef _MANAGED
    #pragma managed(pop)
    #endif

    // 這是匯出變數的範例
    DLLTEST_API int ndlltest=0;

    // 這是匯出函式的範例。
    DLLTEST_API int fndlltest(void)
    {
     return 42;
    }

    // 這是已匯出的類別建構函式。
    // 請參閱 dlltest.h 中的類別定義
    Cdlltest::Cdlltest()
    {
     return;
    }

     

    //==========================

    // DLLTest.h

    //==========================

     

    #ifdef DLLTEST_EXPORTS
    #define DLLTEST_API __declspec(dllexport)
    #else
    #define DLLTEST_API __declspec(dllimport)
    #endif

    // 這個類別是從 dlltest.dll 匯出的
    class DLLTEST_API Cdlltest {
    public:
     Cdlltest(void);
     // TODO: 在此加入您的方法。
    };

    extern DLLTEST_API int ndlltest;

    DLLTEST_API int fndlltest(void);

     

    //=====================

    // 看到的 export 資料

    //=====================

    ?fndlltest@@YAHXZ  

     

     

    2008年3月14日 下午 05:04

解答

  • HI,

     

    亂亂的名字是VC++ Mangle之後結果, 您可以不要用LoadLibrary載入DLL, 而將建置DLL得到的LIB(體積小小的)檔案加入到欲使用DLL的專案, 然後直接使用DLL中提供的功能即可

     

    tihs

    2008年3月17日 上午 07:32

所有回覆