لماذا لا يمكنني الوصول إلى وظيفة DLL الخاصة بي
-
28-09-2019 - |
سؤال
أحاول تحميل 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 ++). ليس لدي مثال علي الآن ، لكن يجب أن تكون قادرًا على العثور على شيء على الشبكة.