السلام عليكم ورحمة الله وبركاتة
سؤالي :
لدي برنامج يستعمل مكتبة Dll وفي هذه المكتبة دوال
كيف استعمال تلك الدوال في برنامجي ؟ هل استطيع ؟ اضن نعم ؟
إذا نعم ...
ولنفرض اني استعمل دوال في مكتبه اسمها python22.dll
والدالة التي استعملها اسمها PyRun_SimpleFile ولا اعرف بارمتراتها...
سؤالي كيف اقوم بإستدعاء تلك الدوال ؟ وكيف استعملها ...؟
[COLOR="SeaGreen"]علماً اني قمت بجلب اسم الدالة اقصد PyRun_SimpleFile من خلال إستعراضي للدوال المصدّرة
للمكتبة في برنامج PE Explorer[/COLOR]
اضن هذه العملية مطبقة على مكتبات النظام kerneal32 ,USER32...ETC
حقيقة الأمر ملخبط قليلا ... على حسب نوع الدالة و برامترتها
أولا ان كانت الدالة تستعمل برامترات عادية من نوع char , integer , string , .. الخ الطريقة سهلة لللتعامل مع الدالة يكفي معرفة اسم الدالة ثم دفع البرامترات و تنفيذ الدالة
أما اذا كانت البرامترات من نوع Object أو كلاس .. فهنا مشكلة ==> ضروري أن تعرف البرامتر لتنفيذ الدالة
أغلب الدوالfunction التي ترجع بقيم TObject تستعمل ما يعرف بال Interface ... لتسهيل العمل بها و مع هذا ستحتاج الى تعريف
ال interface في برنامجك الذي يستعمل ال dll
لذا من الضروري أن تعرف طبيعة البرامترات .. حاول الاطلاع على السورس ان كانت مفتوحة المصدر
نعم هي مفتوحه المصدر بالـ C واضن يوجد كذلك بالـ Delphi ...
هممم ... اضنها تتعامل مع بارمترين الاول string والآخر Integer ووضيفة الدالة هي فتح ملف بتصريح ما
وعلى ما اعتقد انها تواجه الدالة FileOpen في دلفي ...
هذا احد إستعمالات الدالة وجدته على النت :
PHP كود :
main.cpp
#include <Python.h>
int main(int argc, char **argv)
{
Py_Initialize();
FILE *file_1 = fopen("a2l_reader.py","r+");
PyRun_SimpleFile(file_1,"a2l_reader.py");
Py_Finalize();
}
هل تستطيع استنتاج آخر غير هذا ؟
وبعد ان حصلت على البارمترات ... واضن انه لا مشكلة في التعامل معها ... كيف اقوم بإستدعائها وإستعمالها ؟
حصلت على هذا التعريف للدالة من الكود المصدري للمكتبة بلغة السي :
PHP كود :
DL_IMPORT(int) PyRun_SimpleFile(FILE *, char *);
اذن البرامتر عادية .. اذن لا مشكلة
استعمل الدالة LoadLibrary لتحميل المكتبة Python.dll , ثم الدالة GetProcAddress وتمرير اسم الدالة وانتهينا ..
أعتقد ان استعمالها سيكون بهذا الشكل -مع افتراض أن Delphi File = Cpp File type
PHP كود :
type PyRun_SimpleFileType = function(var f: file; s: PChar): boolean; stdcall;
var myFile: file;
hLib: THandle;
SimpleFile, Py_Initialize, Py_Finalize: FARPROC;
PyRun_SimpleFile: PyRun_SimpleFileType;
const a2l_reader: string = 'a2l_reader.py';
begin
PyRun_SimpleFile := nil;
AssignFile(myFile, 'some file');
ReWrite(myFile);
hLib := LoadLibrary(PChar('python22.dll'));
Py_Initialize := GetProcAddress(hLib, 'Py_Initialize');
asm
pushad
call Py_Initialize
popad
end;
PyRun_SimpleFile := GetProcAddress(hLib, 'PyRun_SimpleFile');
if not Assigned(PyRun_SimpleFile) then
raise Exception.Create('Error ..');
PyRun_SimpleFile(myfile, 'a2l_reader.py');
Py_Finalize := GetProcAddress(hLib, 'Py_Finalize');
asm
pushad
call Py_Finalize
popad
end;
CloseFile(myFile);
FreeLibrary(hLib);
end;
------------------------------------------------
مجرد فضول ..
لماذا تلجأ الى كل هذه التعقيدات !!! .. ودلفي تتيح لك كل ما يلزم للتعامل مع الملفات !!!
السلام عليكم ورحمة الله وبركاتة ...
اهلا أخي المبرمج SMP3 ... بالنسبة للكود لن استطيع ان اجربه الآن لان الوقت قد تأهر @@" .. سيكون الحوار غداً إن وجد
اتيت لارد على هذه فقط :
إقتباس : مجرد فضول .. لماذا تلجأ الى كل هذه التعقيدات !!! .. ودلفي تتيح لك كل ما يلزم للتعامل مع الملفات !!!
هههههههه , في الحقيقة انا مهوس ربما او متأكد اني مهوس بالـ Game Hacking ... وانا الآن اتعامل مع لعبة مبرمجة بالبايثون
ومن سعد حضي اني سبق وان درست اساسيات هذه اللغة

... وبعد دراسة اللعبة وجدت اني استطيع تحميل سكربتات
لها تكون مكتوبه بالبايثون ...
لذلك اردت ان اعمل ملف Dll اقوم بحقنه في اللعبة ... وبعد ذلك اقوم بتحميل السكربتات الخاصة باللعبة ... من خلال الـ Dll
حيث ان الـ dll ستكون جزاء من عملية اللعبة وستأخذ صلاحياتها ... وساستعمل المكتبة التي تستعملها اللعبة ... كلام طويل @@"
وانا فعلاً قد قمت ببرمجة برنامج لاعب آلي لهذه اللعبة التي اعمل عليها وانا اسعى لتطويره ... ومن خلال معرفتي لكيفية
تحميل السكربت ساكون قد استطعت ان اطور البرنامج بشكل كبير P:
بالمناسبة ... لم اشكرك على الاجابة ... شكراً لك على المسـاعـدة وجعلها في موازين حسناتك ... اراك غداً P:
والسلام عليكم
السلام عليكم ورحمة الله وبركاتة
احصل على خطاء عند تنفيذ الامر :
كود :
[color=Black]raise Exception.Create('Error ..');[/color]
[color=Red]PyRun_SimpleFile(myfile, 'a2l_reader.py');[/color] // here I get error
[color=Black]Py_Finalize := GetProcAddress(hLib, 'Py_Finalize');[/color]
اعتقد يوجد خطاء في تعريف الدالة
سابحث أكثر وارجع .. إلى هنا من جديد

ALmuhhnad كتب :اعتقد يوجد خطاء في تعريف الدالة
لا ليس خطأ في تعريف الدالة :
الخطأ أننا افترضنا أن Delphi FILE Type = Cpp FILE type
إقتباس : الخطأ أننا افترضنا أن delphi file type = cpp file type
إذا تعتقد ان النوع يختلف في مكتبة بايثون عن ما هو موجود لدينا ... آمممم
اعتقد انك محق ... لكن كيف احصل على النوع !؟
إقتباس :اعتقد انك محق ... لكن كيف احصل على النوع !؟
لا أعلم .. لم أبرمج بالبايثون من قبل و خبرتي في السي ++ متوسطة ...
كل ما علمه عن بايثون هي انها تحتاج الى مفسر ... اذن يمكنك الاطلاع على السورس ...