ورود

View Full Version : سوال: این تابع کی خروجی میده.



Mask
سه شنبه 06 تیر 1391, 17:00 عصر
تابع زیر رو ببینید.

function GetCurrentUserName(var CurrentUserName: string): Boolean;
var
BufferSize: DWORD;
pUser: PChar;
begin
BufferSize := 0;
GetUserName(nil, BufferSize);
pUser := StrAlloc(BufferSize);
try
Result := GetUserName(pUser, BufferSize);
CurrentUserName := StrPas(pUser);
finally
StrDispose(pUser);
end;
end;
این تابع کی خروجی False یا True میده.؟

بهروز عباسی
سه شنبه 06 تیر 1391, 17:22 عصر
زمانی که تابع GetUserName مقداری رو برگردونه باید True باشه و در غیر این صورت هم ....

Mask
سه شنبه 06 تیر 1391, 17:38 عصر
زمانی که تابع GetUserName مقداری رو برگردونه باید True باشه و در غیر این صورت هم ....

در غیر این صورتش مهمه.چه موقعیش مهمه.
اینجور که معلومه این تابع همش true بر میگردونه . اگه اینجور باشه ، برای چی به صورت تابع ، نوشتنش ، میومدن به صورت روال مینوشتند.؟

بهروز عباسی
سه شنبه 06 تیر 1391, 17:45 عصر
فکر کنم به خاطر زبان سی اینطوری نوشته شده باشه(همین جوری گفتم)

لینک زیر رو ببین
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724432%28v=vs.85%29.aspx

BORHAN TEC
سه شنبه 06 تیر 1391, 20:00 عصر
اینجور که معلومه این تابع همش true بر میگردونهنه،اینطور نیست! حالا اگه از کد مسخره زیر استفاده کنی میبینی که False برگردونده میشه(البته منظورم تابع GetUserName است):
procedure TForm1.Button1Click(Sender: TObject);
var
size: Cardinal;
buff: PWideChar;
res: Boolean;
begin
size := 1; // (^_^)
res := GetUserName(buff, size);
ShowMessage(BoolToStr(res));
end;

در هر صورت شما نباید در خصوص توابع API اینگونه قضاوت کنید. در راهنمای مربوط به این تابع گفته شده که"مقدار صفر به معنای عدم موفقیت تابع است" و ممکن است در حالاتی تابع به صورت ناموفق عمل کند. البته ممکن است احتمال آن 1 در 100000000000000 باشد ولی اگر می خواهید که برنامه تان بعداً با این مشکلات ناخواسته مواجه نشود مجبورید که تمهیداتی را پیش بینی کنید. :متفکر:

Mask
سه شنبه 06 تیر 1391, 20:05 عصر
ممنون.
فکر کنم واسه همینه بیشتر توابع api خروجی bool میدهند. قضیه همون تمهیداتست.

BORHAN TEC
سه شنبه 06 تیر 1391, 20:11 عصر
فکر کنم واسه همینه بیشتر توابع api خروجی bool میدهند. قضیه همون تمهیداتست.
دقیقاً همینه. یادمه که قبلاً یکی از سازندگان ویندوز در این رابطه توضیح داده بود و دلیلش رو هم همین قضیه اعلام کرده بود.