PDA

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



merced
جمعه 10 اردیبهشت 1389, 14:12 عصر
سلام
من یک تابع توی یک DLL سی دارم به صورت زیر تعریف شده

int _stdcall MF_GetDeviceSNR(int DeviceAddr, unsigned char *SNR) من توی دلفی به این صورت اعلانش کردم.


Function MF_GetDeviceSNR (DeviceAddr : Integer ; snr : PAnsiChar ) : Integer ; stdcall; external 'MF_API.dll'و به این صورت می خوام فراخوانیش کنم.



var
r : Integer ;
begin
r := MF_GetDeviceSNR(0, x ) ;

ولی با وجود اینکه برگشتی تابع مقدار 0 (یعنی اجرای موفقیت آمیز )است ولی نمتونه به رشته دستیابی داشته باشه و خطای Access Violation میده

میخوام بدونم روش کلی ارسال و دریافت رشته ها به API هاچی هست.

Felony
جمعه 10 اردیبهشت 1389, 15:29 عصر
قبل از استفاده از DLL نباید شئ یا ... رو به وسیله توابعش بسازید ؟
اگر میتونید قرار بدیدش تا ما هم یه نگاهی بهش بکنیم .

vcldeveloper
جمعه 10 اردیبهشت 1389, 18:45 عصر
ولی با وجود اینکه برگشتی تابع مقدار 0 (یعنی اجرای موفقیت آمیز )است ولی نمتونه به رشته دستیابی داشته باشه و خطای Access Violation میده

میخوام بدونم روش کلی ارسال و دریافت رشته ها به API هاچی هست. x رو کجا تعریف کردید، و چطور مقداردهی کردید؟ وقتی تابع از شما مقدار PAnsiChar میخواد، یعنی باید خودتون فضای مورد نیاز اون رو تامین کنید. شما کجا برای اون مقداری که PAnsiChar بهش اشاره میکنه، فضا رزرو کردید؟ PAnsiChar فقط یک اشاره گر هست، باید فضایی از حافظه رو بهش اختصاص بدید، وگرنه خودش به خودی خود کاری برای شما انجام نمیده.

اول بررسی کنید که تابع مورد نظر شما برای اون پارامتر به چه میزان فضا نیاز داره، بعدش با استفاده از SetLength و یک رشته AnsiString اون فضا رو براش تامین کنید:


var
r : Integer;
s : AnsiString;
begin
//Suppose we need a buffer with only 100 characters length.
SetLength(s,100);
r := MF_GetDeviceSNR(0, PAnsiChar(s));
ShowMessage(s);
end;