سؤال

أحاول تحميل DLL باستخدام ديناميكي LoadLibrary(), ، الذي يعمل ، ومع ذلك لا يمكنني بعد ذلك الحصول على عنوان الوظيفة في DLL التي أحاول الاتصال بها.

وظيفة DLL: (في ملف CPP)

_declspec(dllexport) void MyDllFunc()
{
    printf("Hello from DLL");
}

رمز الاتصال:

typedef void (*MyDllFuncPtr)();

int _tmain(int argc, _TCHAR* argv[])
{

    HINSTANCE LoadMe;
    LPCWSTR str = L"C:\\Users\\Tony\\Documents\\Visual Studio 2008\\Projects\\DLL Loading\\Release\\MyDll.dll";

    LoadMe = LoadLibrary(str);

    if(LoadMe != 0)
        printf("Successfully Loaded!\r\n");
    else
        printf("Loading Failed \r\n" );


    MyDllFuncPtr func;

    func = (MyDllFuncPtr)GetProcAddress(LoadMe, "MyDllFunc");

    if (func != NULL)
        func();

    FreeLibrary(LoadMe);

}

Func يعود فارغة !!!

ما الخطأ الذي افعله؟

هذا هو مشروع وحدة التحكم Win32.

هل كانت مفيدة؟

المحلول

يكتب

extern "C" _declspec(dllexport) void MyDllFunc()

نصائح أخرى

أنت تعمل ذلك بالطريقة الخاطئة. __declspec (dllexport) أزواج مع __declspec (dllimport).

#1: In the DLL, declare the function's prototype with __declspec(dllexport).
#2: In the .exe, declare the function's prototype with __declspec(dllimport).
#3: Compile the .dll. You should also get a .lib file.
#4: Link the .exe with the .lib, and compile.
#5: Success.

عند استخدام __declspec (dllimport) و __declspec (dllexport) ، لا تحتاج أبدًا إلى لمس وظائف Winapi لتحميل DLL. Dllimport/Export يفعل كل شيء بالنسبة لك. بالإضافة إلى ذلك ، لا تحتاج إلى extern c أي شيء.

اسم وظائفك المصدرة مزين عند استخدام __declspec (dllexport), ، يمكنك تقليل الديكور باستخدام خارجي "ج", ، ومع ذلك ، لن يكون الرمز غير المزيج تمامًا ، حيث تحتاج إلى استخدام أ ملف def وتصديره كرمز مسمى ، وإلا تحتاج إلى استخدامه GetProcAddress باستخدام اسم الرمز المشوش/المزين ، وهو قصير عند تصديره باستخدام extern "C".

إذا تم تصميم DLL كـ C ++ DLL ، فسيتغير أسماء وظائفها. هذا هو المعتمد على المترجم. أود أن أوصي بشدة بجعله C DLL (شجاعة C+ C ++). ليس لدي مثال علي الآن ، لكن يجب أن تكون قادرًا على العثور على شيء على الشبكة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top