View Full Version : توابع api ویندوز
Borland-Delphi7
سه شنبه 24 اردیبهشت 1387, 11:45 صبح
با سلام
دوستان بنده میخواهم این تاپیک رو به کار با توابع api ویندوز در دلفی اختصاص بدهم و از دوستان تقاضا دارم هر گونه توابع api که در دلفی کار شده را در این تاپیک قرار دهند.
برای شروع من یک تابع میخواهم که فایلها یا فولدر های انتخابی درون ویندوز را شناسایی کنم
اصغر (پآچ)
سه شنبه 24 اردیبهشت 1387, 11:56 صبح
منظورت از شناسایی چیه؟
اگه منظورت پیدا کردن باید از توابع FindFirst و Findnext و ... استفاده کنی!
اگه هم می خوای فایلی رو اجرا کنی باید یونیت ShellAPI در قسمت Uses برنامه ات اضافه کنی کلی هم دستور داره!
منظورتو مشخص کن من میام بازم
vcldeveloper
سه شنبه 24 اردیبهشت 1387, 12:31 عصر
هر گونه توابع api که در دلفی کار شده را در این تاپیک قرار دهند.
دلفی محدودیتی در استفاده از توابع API موجود نداره، پس این میشه کل توابع API ایی که در SDK Windows آمده. اگر به فرض این کار برای همه API های ویندوز انجام بشه، میشه MSDN!
در ضمن، تاپیک هایی با موضوع مشابه این قبلا ایجاد شدند و حتی تا حدودی پیش رفتند، پس نیازی به تاپیک جدید نیست. اگر علاقمند بودید، در یکی از همون تاپیک ها بحث را ادامه بدید.
برای شروع من یک تابع میخواهم که فایلها یا فولدر های انتخابی درون ویندوز را شناسایی کنم
اینجور سوال کردن ها فایده ایی نداره، چون هر کاری که شما در دلفی انجام میدید، نهایتا ختم میشه به اجرای چند API، اگر قرار باشه اینطور سوالاتی در این تاپیک مطرح بشه، هر کی میتونه هر سوالی در دلفی داشت را در همین تاپیک بپرسه. نتیجه اش هم میشه یک تاپیک چند 10 صفحه ایی که نه سوالاتش مشخص هستند، نه مشخص هست کدوم جواب مربوط به کدوم سوال هست!
negarin5340
چهارشنبه 02 مرداد 1387, 13:39 عصر
توابع apiرا باید چگونه بدست آورد منبع بدست آوردن کلیه این توابع را می خواستم ممنون
vcldeveloper
چهارشنبه 02 مرداد 1387, 16:42 عصر
توابع apiرا باید چگونه بدست آورد منبع بدست آوردن کلیه این توابع را می خواستم
تعداد توابع API و تنوع آنها خیلی زیاد هست، در نتیجه این توابع را متناسب با نوع کارکدشان در گروه های مختلف تقسیم می کنند؛ مثلا توابع Shell API، یا CryptoAPI، یا GDI API، و... کاملترین و جامعترین منبع برای این توابع، سایت MSDN (http://msdn.com)هست که منبع رسمی مستندات مربوط به این توابع محسوب میشه. البته علاوه بر سایت آن، نسخه ایی از داده های اصلی آن بصورت سی دی یا DVD هم به همراه دیسک های نصب Visual Studio عرضه میشه. البته به همراه دلفی هم نسخه ایی از Windows SDK که شامل توضیحات مربوط به APIهای مختلف میشه، نصب میشه (رجوع کنید به منوی فایل، گزینه Windows SDK).
smhabbasi
چهارشنبه 06 آذر 1387, 05:59 صبح
من یک Api می خوام که هنگام جستجو اگر نام فایل یا فولدر فارسی بود باز هم بتونه خصوصیاتش را عوض کنه آخه setfileattribute فقط فایلهایی که نامشون انگلیسی هست را عوض می کنه
vcldeveloper
چهارشنبه 06 آذر 1387, 10:37 صبح
من یک Api می خوام که هنگام جستجو اگر نام فایل یا فولدر فارسی بود باز هم بتونه خصوصیاتش را عوض کنه آخه setfileattribute فقط فایلهایی که نامشون انگلیسی هست را عوض می کنه
بخاطر اینکه تا قبل از دلفی 2009، دلفی از یونیکد پشتیبانی نمی کرده، و تمام فراخوانی ها به توابع API ویندوز را به نسخه ASCII آنها ارجاع میداده، یعنی اگر SetFileAttribute دو نسخه ASCII و یونیکد داشته، دلفی بجای SetFileAttributeW، فراخوانی تابع را به SetFileAttributeA که نسخه ASCII آن تابع هست، ارجاع میداده.
در دلفی 2009 فراخوانی توابع API، در صورتی که معادل یونیکد داشته باشند، به نسخه یونیکد آنها ارجاع داده میشه.
برای استفاده از نسخه یونیکد توابع API ویندوز در نسخه های قدیمی تر دلفی، باید بجای استفاده از تابع تعریف شده توسط دلفی، خودتان مستقیما نسخه یونیکد تابع مورد نظر را از DLL مربوطه، فراخوانی کنید.
arash_ebrahimi_nk
پنج شنبه 07 آذر 1387, 01:22 صبح
بخاطر اینکه تا قبل از دلفی 2009، دلفی از یونیکد پشتیبانی نمی کرده، و تمام فراخوانی ها به توابع API ویندوز را به نسخه ASCII آنها ارجاع میداده، یعنی اگر SetFileAttribute دو نسخه ASCII و یونیکد داشته، دلفی بجای SetFileAttributeW، فراخوانی تابع را به SetFileAttributeA که نسخه ASCII آن تابع هست، ارجاع میداده.
در دلفی 2009 فراخوانی توابع API، در صورتی که معادل یونیکد داشته باشند، به نسخه یونیکد آنها ارجاع داده میشه.
برای استفاده از نسخه یونیکد توابع API ویندوز در نسخه های قدیمی تر دلفی، باید بجای استفاده از تابع تعریف شده توسط دلفی، خودتان مستقیما نسخه یونیکد تابع مورد نظر را از DLL مربوطه، فراخوانی کنید.
آیا در دلفی 2009 تشخیص اینکه فراخوانی باید بصورت یونیکد یا ASCII صورت پذیرد بطور خودکار میباشد یا همیشه نسخه یونیکد را فراخوانی میکند؟
برای مثال من از کدهای زیر برای بررسی یونیکد یا غیر یونیکد بودن در دلفی 2007 استفاده کردم :
{$ifdef Unicode}
DataLocal.fnSendMessage := TSendMessage(GetProcAddress(hUser32, 'SendMessageW'));
{$else}
DataLocal.fnSendMessage := TSendMessage(GetProcAddress(hUser32, 'SendMessageA'));
IsWindowUnicode(hWnd)
آیا در دلفی 2009 به چنین بررسی هایی برای تشخیص یونیکد بودن یا نبودن نیاز نیست و این بررسی ها بطور خودکار صورت میپذیرند؟
vcldeveloper
پنج شنبه 07 آذر 1387, 01:38 صبح
آیا در دلفی 2009 به چنین بررسی هایی برای تشخیص یونیکد بودن یا نبودن نیاز نیست و این بررسی ها بطور خودکار صورت میپذیرند؟
نه، در صورتی که نسخه یونیکد تابع وجود داشته باشه، دلفی 2009 از نسخه یونیکد استفاده خواهد کرد. اگر می خواید صراحتا از نسخه ASCII تابع استفاده کنید، نسخه ASCII آن هم به صورت SendMessageA تعریف شده، ولی SendMessage خودش به SendMessageW ارجاع داده میشه. اگر میخواید از هر دو نسخه با یک سورس کد پشتیبانی بشه، بهترین کار همین کامپایل شرطی با استفاده از IFDEF UNICODE هست. البته خیلی از توابع نیازی به این ندارند، چون همانطور که PCHAR در دلفی 2009 به PWideChar ارجاع داده شده، در نسخه ASCII هم PCHAR به PAnsiChar ارجاع داده شده، و عملا در اکثر موارد با کمی دقت میشه از نوشتن کامپایل شرطی هم پرهیز کرد.
hojjatcroos
پنج شنبه 05 دی 1387, 07:10 صبح
سلام یک سری کد از سایت www.delphi3000.com (http://www.delphi3000.com) گرفتم امیدوارم به درد دوستان بخوره
کداول:صدا زدن برنامه هایی که در کنترل پنل هست مثل Add or Remove Programe
ShellExecute(0, ''open'' , ''control.exe'' , ''Desk.cpl,@0,3'', nil, SW_normal);
کد دوم:صدا زدن دیالوگ خاموش کردن رایانه
procedure ExitWindowsDialog(Handle: THandle); stdcall; external 'shell32.dll' index 60; //API declaration
مثال
procedure TForm1.Button1Click(Sender: TObject);
begin
ExitWindowsDialog(Handle);
end;
کد سوم:صدا زدن پنجره انتخاب آیکون
function PickIconDialog(Handle:THandle; FileName:PChar; FileNameSize:integer;var IconIndex:integer):Boolean; stdcall; external 'shell32.dll' index 62;
مثال
procedure TForm1.Button3Click(Sender: TObject);
var
IconIndex: Integer;
begin
if PickIconDialog(Handle, PChar('shell32.dll'), Length('shell32.dll'), IconIndex) then
ShowMessage('Selecciono ' + IntTOStr(IconIndex));
end;
کد چهارم:ساختن یک ShortCut
uses ShlObj, ActiveX, ComObj;
...
procedure TForm1.Button1Click(Sender: TObject) ;
var
IObject : IUnknown;
ISLink : IShellLink;
IPFile : IPersistFile;
PIDL : PItemIDList;
InFolder : array[0..MAX_PATH] of Char;
TargetName : String;
LinkName : WideString;
begin
TargetName := 'c:\windows\system32\calc.exe';
{Use TargetName:=ParamStr(0) which
returns the path and file name of the
executing program to create a link to your
Application}
IObject := CreateComObject(CLSID_ShellLink) ;
ISLink := IObject as IShellLink;
IPFile := IObject as IPersistFile;
with ISLink do
begin
SetPath(pChar(TargetName)) ;
SetWorkingDirectory(pChar(ExtractFilePath(TargetNa me))) ;
end;
در پایان از اساتید عزیز خواهشمندم که کد زیر را که برای عوض کردن تصویر دکمه استارت است را بررسی کنند و ببینند اشکال آن در کجاست.باتشکر
{ define Global vars }
var
Form1: TForm1;
StartButton: hWnd;
OldBitmap: THandle;
NewImage: TPicture;
{ put the Code in the OnCreate event of your form }
procedure TForm1.FormCreate(Sender: TObject);
begin
NewImage := TPicture.create;
NewImage.LoadFromFile('C:\Windows\Circles.BMP');
StartButton := FindWindowEx
(FindWindow(
'Shell_TrayWnd', nil),
0,'Button', nil);
OldBitmap := SendMessage(StartButton,
BM_SetImage, 0,
NewImage.Bitmap.Handle);
end;
{ OnDestroy-Event }
procedure TForm1.FormDestroy(Sender: TObject);
begin
SendMessage(StartButton,BM_SetImage,0,OldBitmap);
NewImage.Free;
end;
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.