PDA

View Full Version : مشکل در استفاده از DLL و تابع دارای پارامتر از نوع String



مهدی کرامتی
شنبه 30 خرداد 1383, 23:38 عصر
با سلام.

من یک DLL در دلفی نوشته‌ام که حاوی یک پارامتر از نوع String است. در هنگام اجرای برنامه از خطی که قرار است تابع فوق را فراخوانی کند این ایراد را میگیرد:

An unhandled exception of type 'System.NullReferenceException' occurred in Invoke_CS.exe

Additional information: Object reference not set to an instance of an object.
این کد نوشته شده در #C است:

using System;
using System.Runtime.InteropServices;

namespace Invoke_CS
{
class Class1
{
[DllImport("EchoStr.dll")]
public static extern bool CheckString(string s);
[STAThread]

static void Main(string[] args)
{
string x="Reza";
if(CheckString(x)==true)
{
Console.WriteLine("True");
}
else
{
Console.WriteLine("False");
}

Console.ReadLine();
}
}
}

مشکل از چیست؟

Inprise
یک شنبه 31 خرداد 1383, 09:35 صبح
برادر ؛

به دلیل ویژگیهای خاص String دلفی ، میدونی که اگر قرار باشه یک String از یک DLL اکسپورت بشه باید یونیت ShareMem هم تو DLL و هم در پروژه ، درج شده باشه . یونیت ShareMem در واقع ماژول borlandMM.dll رو محصور میکنه که امکان تبدیل String های دلفی به رشته های نال ترمینیتد ویندوز رو فراهم میکنه . ممکنه بخای با خوندن متن این یونیت یک نسخهء سازگار با دات نت از روش بنویسی ، یا ممکنه بخای تو یه انتخاب بهتر ، String ها رو با Pchar جایگزین کنی و رستگار از دنیا بری ! :wink:

خوش باشی

مهدی کرامتی
یک شنبه 31 خرداد 1383, 14:13 عصر
سلام.

از پاسخ‌ات ممنون.

من قبلا این کارهایی رو که میگی انجام داده‌ام. این صرفا یک تست است که من تو همه زبانهای مبتنی بر Win32 جوابم مقتضی رو ازش گرفتم.
این رو هم میدونم که مشکل از سمت کد #C است، نه کد نوشته شده در دلفی.

فقط بدلیل آشنایی کم با #C نمیدونم باید چطوری این مشکل رو رفع کنم. امان از ناشی گری و کم حوصلگی :)

Spoofed
یک شنبه 31 خرداد 1383, 14:51 عصر
مثالی از یک دی ال ال ساده در دلفی (به stdcall توجه بفرمایید)


library prj_1;

uses
Dialogs;

{$R *.res}

procedure GetNev( s:PChar );stdcall; export;
begin
ShowMessage(s) ;
end;

exports GetNev;

begin
end.



نحوه ی استفاده از dll فوق در سی شارپ (به تعاریف Calling Convention و Charset نیز توجه بفرمایید ):



using System.Runtime.InteropServices ;

[DllImport( "prj_1.dll", CallingConvention = CallingConvention.StdCall , CharSet=CharSet.Ansi)]
public static extern void GetNev(string s);


اطلاعات بیشتر
http://www.thecodeproject.com/csharp/interop.asp
http://msdn.microsoft.com/msdnmag/issues/03/07/NET/default.aspx

مهدی کرامتی
یک شنبه 31 خرداد 1383, 15:10 عصر
درست شد. مرسی++ :kiss: :flower:

Spoofed
یک شنبه 31 خرداد 1383, 15:27 عصر
ارادتمند بوده و هستیم :flower:

Inprise
یک شنبه 31 خرداد 1383, 15:40 عصر
این رو هم میدونم که مشکل از سمت کد #C است، نه کد نوشته شده در دلفی.

راستش فکر میکنم کد سی شارپ مشکلی نداره ! نکته عدم سازگاری انواع است . String یک رشتهء null-Terminated حقیقی نیست ( به مفهوم ویندوزی اش ) و سی شارپ ، یا هر زبان دیگر ، باهاش با مشکل مواجه خواهد شد . اغلب توصیه میکنند توسعه گران دلفی بجای String از همان Pchar استفاده کنند تا عادت به کاربرد آن باعث نقض Reusability ماژولهائی که مینویسند ، در زبانهای دیگر نشه .

خوش باشی

M.GhanaatPisheh
جمعه 07 اسفند 1383, 11:59 صبح
:oops:

vesal
سه شنبه 20 اردیبهشت 1384, 14:32 عصر
برای استفاده از DLL ها در تمام زبان ها باید پارامترهای String به صورت آرایه ای از کاراکترها ارائه شوند ::نوشتن::

zeus
سه شنبه 28 تیر 1384, 10:59 صبح
Inprise dorostdar mifarmayan ta bagheye

Reza_K
پنج شنبه 10 شهریور 1384, 21:41 عصر
تا اونجایی که من می دونم Marshler به طور خودکار نوع داده System.String را در هنگام مهاجرت از Appdomain مربوط به CLR به فضای آدرس Unmanaged به نوع null-terminated string تبدیل می‌کنه! (مگر مواردی که طول string مشخص باشه، مثل یکی از اعضا ساختاری که به Shell_NotifyIcon فرستاده می‌شه.(اگه درست یادم باشه SHELLNOTIFYINFO بود)

h_bahmany25
شنبه 27 بهمن 1386, 23:48 عصر
با سلام و خسته نباشید به همه شما عزیزان بسیار گرانقدر که هدف شما ارتقاء علم جوانان عزیز مان هست
من یه مثال از ایجاد dll در دلفی میخواستم چون طبق توصیه های کتاب مینویسم ولی جواب نمیده با تشکر

Mahdi.Kiani
یک شنبه 28 بهمن 1386, 00:05 صبح
با سلام و خسته نباشید به همه شما عزیزان بسیار گرانقدر که هدف شما ارتقاء علم جوانان عزیز مان هست
من یه مثال از ایجاد dll در دلفی میخواستم چون طبق توصیه های کتاب مینویسم ولی جواب نمیده با تشکر

سلام
خوش اومدین
1 ) بع تاریخ تاپیک یه نگاهی بندازین (البته خیلی مهم نیست این قضیه)
2 )سوالتون را در بخش دلفی بپرسین

این که می بینید این تاپیک در بخش سی شاپ و 3 سال پیش ایجاد شده به این دلیل است که نویسنده تاپین می خواسته از dll نوشته شده در دلفی درون سی شارپ استفاده کنه
اگر مشکل شما هم همینه که بعید می دونم (چون در همین تاپیک جواب داده شده) و اگر هم کلا با نوشتن dll درون دلفی مشکل دارین همانطور که عرض کردم این جا مربوط به سی شارپ است.
اما یه نکته قابل توجه و تحسین است. اولین بار هست که میبینم یک نفر تازه وارد قبل از اینکه پست بده سرچ کرده.. آفرین برشما دوست عزیز
موفق باشید