ورود

View Full Version : استفاده از کامپوننت دلفی در دات نت



hessam8008
چهارشنبه 19 فروردین 1388, 00:03 صبح
با سلام؛
من یک کامپوننت در دلفی نوشتم (dll) که می خواهم از آن در دات نت استفاده کنم. البته فقط چند تا تابع در داخل dll هست . ولی خطای زیر را می دهد :
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
البته اینم بگم که وقتی پارامترهای من یا خروجی تابع من از نوع رشته ای است این خطا را می دهد و با سایر انواع داده ای این خطا را نمی دهد. کسی هست که با چنین مشکلی برخورد کرده باشد؟

کدهای من در دات نت به زبان وی بی به صورت زیر است:

Declare Auto Function Add2Number Lib "AddDll.dll" Alias "Add2Number" (ByVal num1 As Integer, ByVal num2 As Integer) As Integer
Declare Auto Function Bin2Dec Lib "AddDll.dll" Alias "Bin2Dec" (ByVal binaryNumber As String) As Integer
Declare Auto Sub ShowText Lib "AddDll.dll" Alias "ShowText" (ByVal TXT As String)



موقع فراخوانی تابع زیر مشکلی نداره:
Add2Number(2, 5)
ولی برای فراخوانی تابع زیر همان خطایی که در بالا گفتم، میگه :

ShowText("Hi Ali.")

volvo B12
چهارشنبه 19 فروردین 1388, 00:41 صبح
سلام حسام جان
قبل از هر چیز بگم که بهتر نبود این موضوع رو در قست Dll های مباحث دلفی مطرح می کردی؟:متفکر:
از این به بعد بیشتر توجه کن!!!:لبخندساده:
مشکلی که شما مطرح کردید بی شک ریشته در تفاوت نحوه استفاده از حافظه اشتراکی در دلفی و دات نت داره!
همه دلفی کارا میدونن که برای استفاده از حافظه مشترک بین dll و برنامه استفاده کننده در زبان دلفی
باید یونیتی به نام ShareMem رو در dll و پروژه به اصلاح یوز کنی اما این دلفی کارا نمی دونن که از این یونیت یا یونیت های مشابه چطور می شه در دات نت استفاده کرد. (منم نمیدونم)
پس نتیجه اخلاقی اینکه مشکل شما در واقع نحوه استفاده از dll تولید شده به زبان دلفی در وی بی دات نت است که فقط به دست دو زبانه ها حل می شه:لبخندساده:
برای اینکه بتونیم بهتر نتیجه بگیریم یه پروژه کوچک دلفی که در واقع کدهای یه Dll با توابع شماست رو نوشتم و ضمیمه کردم تا هم وی بی مارها و هم دلفی کاراش راحت تر بتئنن کمک کنن:بوس:

volvo B12
چهارشنبه 19 فروردین 1388, 00:51 صبح
راستی دوستان یادم رفت لیست توابع داخل dll ای رو که ساخته بودم براتون بنویسم تا دوستان وی بی کار راحت تر بتونن از اونها استفاده کنن:اشتباه:
Function Add2Number(Num1 , Num2 : integer) : integer; Stdcall;
این تابع دو عدد می گیره اونها باهم جمع می کنه
Function Bin2Dec(BinaryNumber : string) : Integer; stdcall;
این تابع به رشته عددی شامل صفر و یک می گیره و دهدهی شو به صورت عددی بر می گردونه
Procedure ShowRVSText(YourTxt : String); stdcall;
این پروسیجر یه رشته می گیره بعد معکوسش رو نمایش می ده
Function RVSText(YourText : String) : String; stdcall;
این تابع یه رشته می گیره و معکوسش رو به صورت رشته برمیگردونه

تو این dll یه جورایی همه چیز هست هم عدد هم رشته هم تابع هم پروسیجر هم دیالوگ هم توابع استاندارد و از پیش تعریف شده

vcldeveloper
چهارشنبه 19 فروردین 1388, 02:07 صبح
1- Component در دلفی یک تعریف مشخص داره. به توابعی که شما در یک DLL منتشر می کنید، Component گفته نمیشه.
2- نوع داده string در دلفی یک نوع داده مدیریت شده هست، و دلفی حافظه مورد نیاز آن را کنترل میکنه. این نوع داده با این پیاده سازی در سایر زبان های برنامه نویسی وجود نداره، برای همین هم برنامه دات نت شما هیچ ایده ایی از اینکه این نوع داده چی هست و چطور کار میکنه نداره. اگرمی خواید توابع نوشته در یک زبان را از طریق DLL در اختیار سایر زبان ها قرار بدید، باید از نوع های داده ایی استفاد کنید که برای آن زبان ها شناخته شده باشه.
برای انتقال متن از یک زبان برنامه نویسی به زبان دیگه، می تونید از PChar استفاده کنید. این همان نوع داده ایی هست که APIهای ویندوز برای نقل و انتقال متن ازش استفاده می کنند، و در واقع یک اشاره گر به اولین خانه رشته مورد نظر هست.

volvo B12
چهارشنبه 19 فروردین 1388, 23:46 عصر
با سلام
طبق معمول بهترین و خلاصه ترین جواب رو آقای کشاورز دادن.
حالا اگه ممکنه کمی راجع به نوع داده PChar و تفاوت اون با String توضیح بدین؟
مثلا می شه هر جا که از String استفاده می کنیم بجاش از Pchar استفاده کنیم و برعکس؟:چشمک:

hessam8008
پنج شنبه 20 فروردین 1388, 00:05 صبح
سلامٌ علیکم؛
دست همگی درد نکنه مخصوصاً علی جان (Volvo) که اطلاعات تکمیلی و خیلی مفیدی به این پست اضافه کردن، همین طور آقای کشاورز که در این پست به ما کمک کردند.
من دلفی کار نکردم ولی تا اونجایی که می دونم دات مدیریت حافظه هاشو خودش انجام می ده و نمیدونم که چرا دلفی از کلاس ShareMem استفاده می کنه؟!
ولی می دونم اگر یک آدم خیرخواه پیدا بشه در مورد PChar توضیحاتی بده (ترجیحاً با سورس کد) یک قدم نزدیک تر می شیم.

vcldeveloper
پنج شنبه 20 فروردین 1388, 02:05 صبح
نمیدونم که چرا دلفی از کلاس ShareMem استفاده می کنه؟!
ShareMem یک کلاس نیست، بلکه یک یونیت دلفی هست. وظیفه اش اینه که از یک مدیرحافظه اشتراکی برای برنامه دلفی و DLL دلفی استفاده کنه. در حالت عادی (بدون استفاده از آن)، برنامه استفاده کننده از DLL و DLL مدیر حافظه های جداگانه ایی خواهند داشت، برای همین هم استفاده از نوع داده های نگهداری شده روی Heap مثل string مشکل ساز میشه. در نسخه های جدیدتر دلفی (دلفی 2007 به بعد)، استفاده از ShareMem منسوخ شده، و بجاش از SimpleShareMem استفاده میشه.


حالا اگه ممکنه کمی راجع به نوع داده PChar و تفاوت اون با String توضیح بدین؟
مثلا می شه هر جا که از String استفاده می کنیم بجاش از Pchar استفاده کنیم و برعکس؟
PChar بصورت pointer of char تعریف شده؛ یعنی اشاره گری به یک کارکتر. در دلفی شما می تونید یک نوع داده string را به PChar و بالعکس اختصاص بدید. وقتی یک string را به PChar اختصاص میدید، دلفی بطور خودکار PChar را طوری مقداردهی میکنه که به اولین کارکتر string اشاره بکنه.
در زبان های برنامه نویسی مثل C، نوع داده مسقلی برای رشته ها وجود نداره، و برای ساخت رشته ها باید از آرایه ایی از کارکترها استفاده کرد. انتهای رشته هم با یک کارکتر nil مشخص میشه. در همچین حالتی، یک کد با استفاده از یک اشاره گر به کارکتر به اولین کارکتر رشته اشاره میکنه، و تا رسیدن به کارکتر nil داده ها را میخونه.
در دلفی نیاز به این کار نیست، ولی برای سازگار با توابع API ویندوز، به طور خودکار به انتهای همه رشته های از نوع string یک کارکتر nil اضافه میشه، و بین string و pchar سازگاری ایجاد شده.

بهترین و راحترین کار این هست که در کد DLL خودتان همه جا از string استفاده کنید، و در آخرین لحظه که می خواید رشته را به کد فراخوان تابع ارجاع بدید، آن را به PChar تبدیل کنید.


من دلفی کار نکردم ولی تا اونجایی که می دونم دات مدیریت حافظه هاشو خودش انجام می ده
کد دات نت بصورت Manage شده هست، و از Garbage Collector استفاده میکنه. کد دلفی unmanaged هست، و در آن از Garbafe Collector استفاده نمیشه. string از جمله محدود Typeهای دلفی هست که بطور خودکار مدیریت میشه. برای اینکه بتونید کد دلفی را در دات نت استفاده کنید، باید درباره استفاده از کدهای unmanaged در دات نت تحقیق کنید.

volvo B12
پنج شنبه 20 فروردین 1388, 23:56 عصر
حسام جان از شما که در فاروم های دیگه هم فعالی انتظار داریم بیشتر به مطالب توجه کنی!!!
من که برات قضیه حافظه اشتراکی رو تو پست قبلی گفتم
حالا جناب کشاورز تکمیل ترش کردن
امیدوارم با مطالبی که اینجا مطرح شد و با پروژه ای که من در پست بعدی خواهم گذاشت بتونی یه نمونه برنامه ترو تمیز با دات نت بنویسی و برای تشکر از آقای کشاورز هم که شده وانو در سایت برای استفاده عموم و البته خودم قرار بدی
ضمنا اگه مطلب مرتبی درباره استفاده از کدهای unmanaged در دات نت گیر آورده در ادامه همین تاپیک بذار چون فکر می کنم بدرد بخوره
ممنون