الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

إستخدام ملفات ال Dll

بدأه Blueteeth في 10 مارس 2008 · 3 رد · 1,297 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم,

أعمل اﻷن على تطبيق يستخدم ال PKCS 11, و هو ستاندرد للتعامل مع ال smart tokens/cards, المهم, مصنعى ال token دى أمدونى بال dll الخاص بهم اللى بي implement الستاندرد ده, و لم يمدونى بأى شئ أخر, و بعد بحث بسيط وجدت أن الموقع المسئول عن الستاندرد يمدنى بملف هيدر للمكتبة. السؤال هو كيف أستخدم ال dll و ال .h فى بناء تطبيقى؟ حيث أنى أعرف أن البناء يتم من خلال .lib مش .dll! و يا ريت حد مشكورا يشرح الفرق ما بينهم بالظبط حيث أن معلوماتى عنهم بسيطه جدا ﻻ تتعدى بضع كلمات.

شكرا مقدما إخوتى و أخواتى.

#2

السلام عليكم و رحمة الله و بركاته

بامكانك إستعمال المكتبة الديناميكية dllفي السي او بيئة الدوت نت باستعمال المكتبات: dllimport (.Net) loadlibrary freelibrary

و بامكانك استعمال المكتبتين .h و .lib هكذا

#include "yourheaderfile.h"
 #pragma comment(lib,"yourlibfile.lib")

post-91400-1205251214_thumb.jpg

post-91400-1205251164_thumb.jpg

#3

ممم طيب و إزاى أنادى الدوال من ال dll؟ المفروض إنى أستخدم GetProcAddress لكل دالة عايز أستخدمها؟!

أنا لو معايا ال lib كان الموضوع بقا أسهل كتير!

#4

السلام عليكم و رحمة الله و بركاته

إنسى الملفات التي لديك و ال lib ...

و لنجرب هذا المثال البسيط:

سنقوم أولا بكتابة مكتبة dll و نقوم باستدعائها من كود سي

عند إنشاء مشروع جديد من نوع Visual c++\Win32\Win32 Project\DLL نحصل على الكود التالي:

					 #include "stdafx.h"

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

					 BOOL APIENTRY DllMain( HMODULE hModule,
											DWORD  ul_reason_for_call,
											LPVOID lpReserved
										  )
					 {
						 return TRUE;
					 }

					 #ifdef _MANAGED
					 #pragma managed(pop)
					 #endif

بامكاننا ترك الكود كما هو و نضيف فقط الدالة التالية و التي ستكون إحدى مخرجات المكتبة و ترجع دائما الرقم 10.

extern "C" __declspec(dllexport) int _stdcall MyMethod()
					 { return 10;}

extern "C": ولكن هنا تم تحديد نوع لغة البرمجة "سي" لذلك هذه طريقة أخرى أكثر حرفية ;) تتماشى مع السي و السي++

				 #include "stdafx.h" 
				 #include "stdio.h" 

				 #ifdef __cplusplus	// used C++, 
				 extern "C" {		  // export C interface
				 #endif


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

				 BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
				   { return TRUE; }

				 #ifdef _MANAGED
				 #pragma managed(pop)
				 #endif

				 __declspec(dllexport) int __cdecl myMethod()
				 { return 10;
				 }

				 #ifdef __cplusplus
				 }
				 #endif

وهكذا تكون المكتبة جاهزة للإستخدام

ملاحظة: عند الترجمة استعملF6 عوض F5. لأن هذا النوع من المشاريع لا يرجع ملف تشغيل بل مكتبة (compile).

قم الآن بنسخ المكتبة في المجلد c:\Windows\System32

وهكذا تقوم بإستدعاء المكتبة التي سميتهاMyDll و الدالة التي بداخلها و سميتها MyNethod

// testarabteam2000.cpp : Defines the entry point for the console application.
	 #include "stdafx.h"
	 #include <windows.h> 
	 #include <stdio.h> 
	 typedef int (__cdecl *MYPROC)(LPWSTR); 

	 void _tmain(int argc, _TCHAR* argv[])
	 {
		 HINSTANCE Instance_To_Load_Lib; 
		 MYPROC PROC_To_Load_Method; 
		 BOOL bRet_free_Lib, bRet_To_Load_Method = FALSE; 

		 // Load DLL
		 Instance_To_Load_Lib = LoadLibrary(TEXT("MyDll")); 

		 // Get function @ if Load DLL succeded
		 if (Instance_To_Load_Lib != NULL) 
		 {   PROC_To_Load_Method = (MYPROC) GetProcAddress(Instance_To_Load_Lib, "myMethod"); 

			 // If the function address is valid, call the function.
			 //call the target method if @ is valid
			 if (NULL != PROC_To_Load_Method) 
			 {   bRet_To_Load_Method = TRUE;
				 (PROC_To_Load_Method) (L"DLL function found\n"); 
			 }

			 //Free the loaded DLL.
			 bRet_free_Lib = FreeLibrary(Instance_To_Load_Lib); 
		 } 

		 // Failed to load the DLL.
		 if (! bRet_To_Load_Method) 
			 printf("Failed to load the DLL.\n Please check the existing of the target dll in c:\\windows\\system32.\n"); 

		 system("PAUSE");
	 }

post-91400-1205325823_thumb.jpg

testarabteam2000.zip

MyDll.zip

مواضيع مشابهة