PDA

View Full Version : کسی این کد ++C رو می تونه به دلفی ترجمه کنه؟



Hadizadeh
چهارشنبه 10 بهمن 1386, 15:31 عصر
دوستان کد C++ زیر رو دارم می خوام به دلفی تبدیل کنم. توابع این کد در یک فایل DLL موجود هستند:


-------------------------------------------------------------
Ali.h
-------------------------------------------------------------
class Ali
{
public
int Ali_Method1(void **p);
virtual int Ali_Methd2;
}



-------------------------------------------------------------
Ali.cpp
-------------------------------------------------------------
Ali *A;
HINSTANCE hDLL;
....
hDll = LoadLibrary( "Ali.DLL" );
Ali_Method1 = GetProcAddress( hDll, _T( "Ali_Method1" ) );

Ali_Method1( (void **) A);
A->Ali_Method2;

حالا ترجمه دلفیشو می خوام. ممنون میشم کمکم کنید.

vcldeveloper
چهارشنبه 10 بهمن 1386, 16:29 عصر
Ali = class
public
function Ali_Method1(P: pointer): integer;
function Ali_Method2: integer; virtual;
end;
برای ادامه ماجرا در شرایط عادی باید از روشی مثل این تاپیک استفاده کنید:
کلاس در dll (http://barnamenevis.org/forum/showthread.php?t=84511)

اگر خودتون به سورس DLL دسترسی ندارید، باید DLL مربوطه تابعی برای ایجاد Instance از این کلاس ارائه کنه. حتی در اینصورت هم شی ساخته شده قابل typecast کردن در دلفی نخواهد بود، چون ساختار یک کلاس در حافظه در ++C با دلفی فرق میکنه. شاید بشه با داشتن شناخت از ساختار کلاس در ++C، آدرس متدهای مربوط به شی ساخته شده را بدست آورد، ولی این بخش از کار مربوط به فردی میشه که تسلط کافی بر ++C داشته باشه.

Hadizadeh
چهارشنبه 10 بهمن 1386, 23:21 عصر
ممنون. من به سورس DLL دسترسی ندارم ولی این DLL تابعی جهت ساخت یک Instance از کلاس مربوطه رو در اختیار می ذاره که توسط اون یک پوینتر به نمونه ساخته شده از جنس ** void رو بر می گردونه. تعریف این کلاس رو در یک هدر ++C دارم (Ali.h) که در اون declaration توابع کلاس مشخص شده ولی خوب پیاده سازی و یا تعریف توابع در خود DLL هست. نکته بعد اینکه توسط کد زیر می تونم به توابع کلاس دسترسی داشته باشم بدون اینکه نیاز باشه تا حتما یک نمونه از کلاس رو بسازم یعنی مثلا اگر داشته باشیم:


class Ali
{
public
virtual int Ali_Method2;
}

اونوقت می تونم توسط کد زیر به متد Ali_Method2 دسترسی داشته باشم:


type TAli_Method2=function():shortint;
Ali_Method2:TAli_Method2=nil;
...
var hDLL:HINST;
hDLL:=LoadLibrary('Ali.DLL');
@Ali_Method2:=GetProcAddress(hDLL,'Ali_Method2');
....
i:=Ali_Method2; //access to the function here

ولی بحث اینه که در دموی ++C این برنامه ابتدا توسط تابع CreateInstance کلاس مذکور یک نمونه از کلاس مثلا A ساخته میشه و سپس توسط A.Ali_Method2 به این تابع دسترسی پیدا میکنه (همونطور که در پست اول یه مثال زده شده) حالا به نظر شما ساختن یک نمونه از کلاس حتما ضروری هست؟ ممنون

Inprise
چهارشنبه 10 بهمن 1386, 23:45 عصر
دسترسی به کلاسهائی که توسط ++C ارائه میشن در دلفی ( و بالعکس ) اگر غیر ممکن نباشه در مواردی که ممکن هست هم کار سختی هست که ضرورتی نداره . تو با هر میزان سواد سی++ میتونی یک Lib ساده بسازی که از کلاس DLL ات یک نسخه میسازه و توابع مورد نظر رو فراخوانی و اجرا میکنه ، و بعد این کتابخانه رو به فرمت OMF تبدیل کن و در دلفی لینک و استفاده اش کن . نباید بین کتابخانه کلاس دلفی و سی تعامل مبتنی بر کلاس وجود داشته باشه .

Hadizadeh
پنج شنبه 11 بهمن 1386, 07:30 صبح
ممنونم. ولی از فرمت OMF چه جوری باید تو دلفی استفاده کرد؟ یه مقدار اگه در مورد OMF توضیح بدید ممنون میشم.

Hadizadeh
پنج شنبه 11 بهمن 1386, 13:54 عصر
تا اونجا که فهمیدم باید فایل LIB. کلاس مورد نظر رو که البته دارمش به فرمت OMF تبدیل کنم که نمی دونم چی هستش و سپس یه جوری این OMF رو به لینکر دلفی بدم که اینم نمی دونم و حدس می زنم پس از همه این کارا دوباره باید برسیم سر جای اولمون که یک Declaration برای هر تابع تو دلفی بنویسیم که بدترین قسمت کاره و وقت گیر ترین مرحله! ولی نظر شما چیه؟

Hadizadeh
پنج شنبه 11 بهمن 1386, 14:14 عصر
ببینید تا اینجا اون چیزایی که فهمیدم اینا هستند: گفتم که من LIB. فایل DLL. ام رو دارم که نمی دونم فرمت اون OMF(Object Module Format) هست یا COFF که البته این یکی رو هم نمی دونم چیه! حالا با ابزاری مثل implib در C++ Builder می تونیم از DLL. یک LIB. بسازیم و توسط ابزاری مثل coff2omf فرمت این LIB. رو به OMF تبدیل کنیم. حالا نمی دونم این LIB تبدیل شده به فرمت OMF رو چه جوری تو دلفی import کنم و سپس به فانکشن های اون چه جوری دسترسی پیدا کنم!