سؤال

لدي حل في مقابل 2008 مع 2 مشروع في ذلك. واحد هو dll مكتوب في C ++ والآخر هو تطبيق وحدة التحكم C ++ بسيطة تم إنشاؤها من مشروع فارغ. أود معرفة كيفية استدعاء الوظائف في DLL من التطبيق.

افترض أنني أبدأ بمشروع فارغ C ++ وأنني أرغب في استدعاء وظيفة تسمى int IsolatedFunction(int someParam)

كيف أسميها؟

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

المحلول

هناك العديد من الطرق للقيام بذلك، لكنني أعتقد أن أحد خيارات أسهل هو ربط التطبيق إلى DLL في وقت الارتباط ثم استخدام ملف تعريف لتحديد الرموز المراد تصديرها من DLL.

مذكرة قانونية: نهج الملف تعريف يعمل بشكل أفضل ل غير مشكل أسماء الرموز. إذا كنت ترغب في تصدير الرموز المزخرفة، فمن المحتمل أن تكون أفضل ليس للاستخدام نهج ملف تعريف.

إليك مثال بسيط على كيفية القيام بذلك.

الخطوة 1: تحديد الوظيفة في التصدير ملف.

int WINAPI IsolatedFunction(const char *title, const char *test);

الخطوة 2: تحديد الوظيفة في Export.CPP. ملف.

#include <windows.h>

int WINAPI IsolatedFunction(const char *title, const char *test)
{
    MessageBox(0, title, test, MB_OK);
    return 1;
}

الخطوه 3: تحديد الوظيفة كتصدير في Export.Def. ملف defintion.

EXPORTS    IsolatedFunction          @1

الخطوة 4: إنشاء مشروع DLL وإضافة Export.CPP. و Export.Def. الملفات إلى هذا المشروع. بناء هذا المشروع سيخلق export.dll. و export.lib. ملف.

الخطوتين التاليان رابطان إلى DLL في الوقت الرابط. إذا كنت لا ترغب في تحديد نقاط الدخول في الوقت الرابط، فتجاهل الخطوتين التاليين واستخدام loadlibrary. و getprocaddress. لتحميل نقطة إدخال الوظيفة في وقت التشغيل.

الخطوة 5: إنشاء اختبار مشروع التطبيق لاستخدام DLL عن طريق إضافة export.lib. ملف إلى المشروع. انسخ ال export.dll. ملف إلى نفس الموقع مثل اختبار وحدة التحكم القابلة للتنفيذ.

الخطوة 6: اتصل ب عيستيل وظيفة من داخل تطبيق اختبار كما هو موضح أدناه.

#include "stdafx.h"

// get the function prototype of the imported function
#include "../export/export.h"

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    // call the imported function found in the dll
    int result = IsolatedFunction("hello", "world");

    return 0;
}

نصائح أخرى

يمكن أيضا تصدير الوظائف من DLL والاستيراد من EXE، إنه أكثر صعوبة في البداية ولكن في النهاية أسهل بكثير من الاتصال LoadLibrary / GetProcaddress. يرى MSDN..

عند إنشاء المشروع باستخدام "معالج VS"، هناك خانة اختيار في DLL تتيح لك تصدير الوظائف.

ثم، في تطبيق EXE، يجب عليك فقط #Include عن رأس من DLL مع التعريفات المناسبة، وإضافة مشروع DLL كاعتماد على تطبيق EXE.

تحقق من السؤال الآخر إذا كنت ترغب في التحقيق في هذه النقطة تصدير وظائف من DLL مع dllexport.

يمكنك إما أن تذهب مسار LoadLibrary / GetProcaddress (كما ذكر هاربر في إجابته، وهنا رابط وقت التشغيل الديناميكي يربط نموذج MSDN مرة أخرى) أو يمكنك ربط تطبيق وحدة التحكم الخاصة بك إلى .LIB المنتجة من مشروع DLL وتشمل ملف Hea.h مع إعلان وظيفتك (كما هو موضح في تحميل الوقت الديناميكي ربط عينة MSDN)

في كلتا الحالتين، تحتاج إلى التأكد من تصدير DLL الخاص بك الوظيفة التي تريد الاتصال بها بشكل صحيح. أسهل طريقة للقيام بذلك هي باستخدام __DECLSPEC (DLLEXPORT) على إعلان الوظيفة (كما هو موضح في إنشاء أ مكتبة رابط ديناميكية بسيطة MSDN)، على الرغم من أنه يمكنك القيام بذلك أيضا من خلال ملف .def المقابلة في مشروع DLL الخاص بك.

لمزيد من المعلومات حول موضوع DLLS، يجب أن تصفح من خلال MSDN حول مكتبات الارتباط الحيوي عنوان.

فيما يلي الخطوات الخمس المطلوبة:

  1. أعلن مؤشر الوظيفة
  2. تحميل المكتبة
  3. الحصول على عنوان الإجراء
  4. تعيينه لمؤشر العمل
  5. استدعاء الوظيفة باستخدام مؤشر الوظيفة

يمكنك العثور على خطوة بخطوة VC ++ شاشة IDE http://www.softwareandfinance.com/visual_cpp/dlldynamicbinding.html.

هنا مقتطف شفرة:

int main()
{
/***
__declspec(dllimport) bool GetWelcomeMessage(char *buf, int len); // used for static binding
 ***/
    typedef bool (*GW)(char *buf, int len);

    HMODULE hModule = LoadLibrary(TEXT("TestServer.DLL"));
    GW GetWelcomeMessage = (GW) GetProcAddress(hModule, "GetWelcomeMessage");

    char buf[128];
    if(GetWelcomeMessage(buf, 128) == true)
        std::cout << buf;
        return 0;
}

تفترض أنك تتحدث عن تحميل وقت التشغيل الديناميكي DLLs، فأنت تبحث عن loadLibrary و getproaddress. هناك مثال على MSDN..

عند إنشاء DLL، عادة ما يتم إنشاء Import Lib تلقائيا ويجب عليك استخدامها المرتبطة ببرنامجك إلى جانب ملفات الرأس للاتصال بها ولكن إذا لم يكن الأمر كذلك، فيمكنك الاتصال بوظائف Windows يدويا مثل loadlibrary. و getprocaddress. للحصول عليه العمل.

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