PDA

View Full Version : صدا زدن يك تابع از طريق DLL



دنیای دلفی
دوشنبه 17 تیر 1387, 22:58 عصر
چرا نمي توان يك تابع را از درون يك فايل اجرايي به وسيله يك Dll صدا زد .

Mahyaa
سه شنبه 18 تیر 1387, 00:16 صبح
من اصلا نفهمیدم چی رو نمیشه چی کار کرد !
یک تابع توی Dll هست که میخواهید صدا بزنید ؟ مشکل چیه ؟

دنیای دلفی
سه شنبه 18 تیر 1387, 14:39 عصر
نه يك تابع داخل فايل اجرايي است مي خواهيم از درون Dll آن را صدا بزنيم نمي شود خطا مي دهد .
البته ظاهرا هيچ تابعي را نمي توان صدا زد

vcldeveloper
سه شنبه 18 تیر 1387, 15:51 عصر
نه يك تابع داخل فايل اجرايي است مي خواهيم از درون Dll آن را صدا بزنيم نمي شود خطا مي دهد .
چه کدی نوشتید؟


البته ظاهرا هيچ تابعي را نمي توان صدا زد
میشه؛ مثلا میشه از Callback function استفاده کرد.

دنیای دلفی
سه شنبه 18 تیر 1387, 16:56 عصر
من يك تابع در فايل اجرايي دارم كه يك سري اطلاعات را (بررسي قفل) چك مي كند .
در Dll يك روند دارم كه CRC حافظه را به صورت RunTime چك مي كند . اگر اطلاعات حافظه تغيير پيدا كرده بود يعني پج يا با لودر دستكاري شده بود دوباره آدرس مربوطه را باز سازي مي كند يعني حافظه را ترميم مي كند .
وسپس تابع بررسي قفل را اجرا مي كند . حالا اين اجرا شدن از طريق DLL است يعني تابع را بوسيله Dll صدا مي زنيم ولي چون اين تابع در فايل اجرايي است خطا مي دهد .

منظور شما همون Tls Call Back است .
اگر بله لطفا بيشتر توضيح دهيد

vcldeveloper
سه شنبه 18 تیر 1387, 17:34 عصر
منظور از Callback function این هست که شما یک قالب برای تابعی که باید فراخوانی شود در نظر می گیرید، مثلا

TCallbackFunc = function (Param: integer): integer;و تابع مربوطه در EXE را بر اساس همین قالب می نویسید، مثلا:

function MyExeFunc(Param: integer): integer;و در هنگام لود کردن DLL، آدرس این تابع را به DLL پاس می دهید:
ـعریف در DLL:

procedure MyDllFunc(CallbackAddr: pointer);فراخوانی در EXE در زمان لود کردن DLL:

MyDLLFunc(@MyExeFunc(;در داخل DLL هم یک تابع از قالب فوق میسازید:

ExeFunc : TCallbackfunc;و آدرس دریافت شده را به آن نسبت می دهید:

@ExeFunc := CallbackAddr;
و تابع مربوطه را از داخل DLL اجرا می کنید، مثلا:

ExeFunc(7263);

مثلا تابع EnumWindows در ویندوز از تابع Callback استفاده میکنه. یعنی برنامه یک تابع تعریف میکنه و آدرسش را به EnumWindows میده، این تابع هم هر زمان که یک Window پیدا میکنه، این تابع را از داخل DLL فراخوانی میکنه. قالب این تابع Callback با نام EnumWindowsProc تعریف شده.