PDA

View Full Version : مشکل String در dll



جمعه 11 دی 1383, 11:49 صبح
سلام بچه ها
من یه DLL ساختم اینجوری:

Procedure GetMainBoardSerial(Var S:PChar);STDCall;
Var Bios:TSMBios;
Begin
Bios:=TsmBios.Create;
bios.GetInfo;
S:=PChar(Bios.MainBoardSerial);
Bios.Free;
End;
وقتی اونو اینجوری صدا میزنم خطای access violation میده:

procedure TForm1.Button1Click(Sender: TObject);
var s:PChar;
begin
GetMem(s,128);
GetMainBoardSerial(S);

FreeMem(s,128);

end;

رشته ای که برمیگردونه 10کاراکتر بیشتر نیست.
چیکار باید بکنم؟

hps
جمعه 11 دی 1383, 14:26 عصر
به جاى مقدار مستقیم دادن به متغیر S توى DLL از StrCopy استفاده کن، شاید مشکلت حل بشه. در ضمن براى استفاده از به جاى GetMem و FreeMem از StrNew و StrDispose استفاده کن.

جمعه 11 دی 1383, 22:41 عصر
قابل توجه مشکل اینجوری حل شد:


function GetMainBoardSerial:PChar;
Var Bios:TSMBios;
Begin
Bios:=TsmBios.Create;
bios.GetInfo;
Result := StrAlloc(Length(Bios.MainBoardSerial));
StrCopy(Result,PChar( Bios.MainBoardSerial));

Bios.Free;
End;

Mah
شنبه 12 دی 1383, 11:18 صبح
سلام
همانطور که در برنامه نوشته شده در DLL از نوع String نمی توان استفاده کرد ولی به جای آن می توان:
1- از نوع PCHAR استفاده کرد .
2- همانطور که در توضیحات Wizard DLL وجود دارد از UNIT . MMBorland استفاده کنید .

شنبه 12 دی 1383, 16:16 عصر
همانطور که در توضیحات Wizard DLL وجود دارد از UNIT . MMBorland استفاده کنید
این بدترین راه حل ممکنه چون هم باید یونیت ShareMem رو به Uses اضافه کنی هم فایل Borland??.dll که اسمش کامل یادم نیست رو بزاری کنار برنامه ضمنا سرعتش هم خیلی کمه.
همونی که بالا نویشتم بهترین راه ممکنه