Meluncurkan Aplikasi (ShellExecute, ShellExecuteEx, SHELLEXECUTEINFO)
Setelah aplikasi Anda menemukan objek file, langkah selanjutnya adalah sering bertindak di atasnya dalam beberapa cara. Misalnya, aplikasi Anda mungkin ingin meluncurkan aplikasi lain yang memungkinkan pengguna mengubah file data. Jika file yang menarik dapat dieksekusi, aplikasi Anda mungkin hanya ingin meluncurkannya. Dokumen ini membahas cara menggunakan ShellExecute atau ShellExecuteEx untuk melakukan tugas-tugas ini.
- Menggunakan ShellExecute dan ShellExecuteEx
- Contoh Sederhana Tentang Cara Menggunakan ShellExecuteEx
Untuk menggunakan ShellExecute atau ShellExecuteEx, aplikasi Anda harus menentukan objek file atau folder yang akan ditindaklanjuti, dan kata kerja yang menentukan operasi. Untuk ShellExecute, tetapkan nilai-nilai ini ke parameter yang sesuai. Untuk ShellExecuteEx, isi anggota struktur SHELLEXECUTEINFO yang sesuai. Ada juga beberapa anggota atau parameter lain yang dapat digunakan untuk menyempurnakan perilaku kedua fungsi tersebut.
Objek file dan folder dapat menjadi bagian dari sistem file atau objek virtual, dan dapat diidentifikasi dengan jalur atau penunjuk ke daftar pengidentifikasi item (PIDL).
Kata kerja yang tersedia untuk objek pada dasarnya adalah item yang Anda temukan di menu pintasan objek. Untuk menemukan kata kerja mana yang tersedia, lihat di registri di bawah
\ HKEY_CLASSES_ROOT CLSID\{object_clsid}\Shell\Verba
di mana object_clsid adalah pengidentifikasi kelas (CLSID) objek, dan kata kerja adalah nama kata kerja yang tersedia. Subkunjud perintahkata kerja\ berisi data yang menunjukkan apa yang terjadi ketika kata kerja tersebut dipanggil.
Untuk mengetahui kata kerja mana yang tersedia untuk objek Shell yang telah ditentukan sebelumnya, lihat di registri di bawah
\ HKEY_CLASSES_ROOT \ object_name Shell\Verba
di mana object_name adalah nama objek Shell yang telah ditentukan sebelumnya. Sekali lagi,subkunjuk perintahkata kerja\ berisi data yang menunjukkan apa yang terjadi ketika kata kerja tersebut dipanggil.
Kata kerja yang umum tersedia meliputi:
Kata kerja | Deskripsi |
---|---|
edit | Meluncurkan editor dan membuka dokumen untuk pengeditan. |
cari | Memulai pencarian mulai dari direktori yang ditentukan. |
buka | Meluncurkan aplikasi. Jika file ini bukan file yang dapat dieksekusi, aplikasi terkait akan diluncurkan. |
Cetak | Mencetak file dokumen. |
properti | Menampilkan properti objek. |
Jalankan Sebagai | Meluncurkan aplikasi sebagai Administrator. Kontrol Akun Pengguna (UAC) akan meminta persetujuan pengguna untuk menjalankan aplikasi yang ditinggikan atau memasukkan kredensial akun administrator yang digunakan untuk menjalankan aplikasi. |
Setiap kata kerja sesuai dengan perintah yang akan digunakan untuk meluncurkan aplikasi dari jendela konsol. Kata kerja terbuka adalah contoh yang baik, karena biasanya didukung. Untuk file .exe, buka hanya meluncurkan aplikasi. Namun, lebih sering digunakan untuk meluncurkan aplikasi yang beroperasi pada file tertentu. Misalnya, file .txt dapat dibuka oleh Microsoft WordPad. Kata kerja terbuka untuk file .txt dengan demikian akan sesuai dengan sesuatu seperti perintah berikut:
"C:\Program Files\Windows NT\Accessories\Wordpad.exe" "%1"
Saat Anda menggunakan ShellExecute atau ShellExecuteEx untuk membuka file .txt, Wordpad.exe diluncurkan dengan file yang ditentukan sebagai argumennya. Beberapa perintah dapat memiliki argumen tambahan, seperti bendera, yang dapat ditambahkan sesuai kebutuhan untuk meluncurkan aplikasi dengan benar. Untuk diskusi lebih lanjut tentang menu pintasan dan kata kerja, lihat Memperluas Menu Pintasan.
Secara umum, mencoba menentukan daftar kata kerja yang tersedia untuk file tertentu agak rumit. Dalam banyak kasus, Anda cukup mengatur parameter lpVerb ke NULL, yang memanggil perintah default untuk jenis file. Prosedur ini biasanya setara dengan mengatur lpVerb ke "open", tetapi beberapa jenis file mungkin memiliki perintah default yang berbeda. Untuk informasi selengkapnya, lihat Memperluas Menu Pintasan dan dokumentasi referensi ShellExecuteEx .
Layanan rantai situs dapat mengontrol banyak perilaku aktivasi item. Pada Windows 8, Anda dapat memberikan pointer ke rantai situs ke ShellExecuteEx untuk mengaktifkan perilaku ini. Untuk menyediakan situs ke ShellExecuteEx:
- Tentukan bendera SEE_MASK_FLAG_HINST_IS_SITE di anggota fMaskSHELLEXECUTEINFO.
- Berikan IUnknown di anggota hInstAppSHELLEXECUTEINFO.
Saat pengguna mengklik kanan ikon folder di Windows Explorer, salah satu item menu adalah "Cari". Jika mereka memilih item tersebut, Shell meluncurkan utilitas Pencariannya. Utilitas ini menampilkan kotak dialog yang dapat digunakan untuk mencari file untuk string teks tertentu. Aplikasi dapat secara terprogram meluncurkan utilitas Pencarian untuk direktori dengan memanggil ShellExecute, dengan "temukan" sebagai parameter lpVerb , dan jalur direktori sebagai parameter lpFile . Misalnya, baris kode berikut meluncurkan utilitas Pencarian untuk direktori c:\MyPrograms.
ShellExecute(hwnd, "find", "c:\\MyPrograms", NULL, NULL, 0);
Contoh aplikasi konsol berikut mengilustrasikan penggunaan ShellExecuteEx. Sebagian besar kode pemeriksaan kesalahan telah dihilangkan untuk kejelasan.
#include <shlobj.h>
#include <shlwapi.h>
#include <objbase.h>
main()
{
LPITEMIDLIST pidlWinFiles = NULL;
LPITEMIDLIST pidlItems = NULL;
IShellFolder *psfWinFiles = NULL;
IShellFolder *psfDeskTop = NULL;
LPENUMIDLIST ppenum = NULL;
STRRET strDispName;
TCHAR pszParseName[MAX_PATH];
ULONG celtFetched;
SHELLEXECUTEINFO ShExecInfo;
HRESULT hr;
BOOL fBitmap = FALSE;
hr = SHGetFolderLocation(NULL, CSIDL_WINDOWS, NULL, NULL, &pidlWinFiles);
hr = SHGetDesktopFolder(&psfDeskTop);
hr = psfDeskTop->BindToObject(pidlWinFiles, NULL, IID_IShellFolder, (LPVOID *) &psfWinFiles);
hr = psfDeskTop->Release();
hr = psfWinFiles->EnumObjects(NULL,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &ppenum);
while( hr = ppenum->Next(1,&pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)
{
psfWinFiles->GetDisplayNameOf(pidlItems, SHGDN_FORPARSING, &strDispName);
StrRetToBuf(&strDispName, pidlItems, pszParseName, MAX_PATH);
CoTaskMemFree(pidlItems);
if(StrCmpI(PathFindExtension(pszParseName), TEXT( ".bmp")) == 0)
{
fBitmap = TRUE;
break;
}
}
ppenum->Release();
if(fBitmap)
{
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = NULL;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = pszParseName;
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_MAXIMIZE;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
}
CoTaskMemFree(pidlWinFiles);
psfWinFiles->Release();
return 0;
}
Aplikasi ini pertama kali mengambil PIDL direktori Windows, dan menghitung isinya sampai menemukan file .bmp pertama. Tidak seperti contoh sebelumnya, IShellFolder::GetDisplayNameOf digunakan untuk mengambil nama penguraian file alih-alih nama tampilannya. Karena ini adalah folder sistem file, nama penguraian adalah jalur yang sepenuhnya memenuhi syarat, yang diperlukan untuk ShellExecuteEx.
Setelah file .bmp pertama ditemukan, nilai yang sesuai ditetapkan untuk anggota struktur SHELLEXECUTEINFO . Anggota lpFile diatur ke nama penguraian file, dan anggota lpVerb ke NULL, untuk memulai operasi default. Dalam hal ini, operasi default adalah "buka". Struktur kemudian diteruskan ke ShellExecuteEx, yang meluncurkan handler default untuk file bitmap, biasanya MSPaint.exe, untuk membuka file. Setelah fungsi kembali, PIDL dibebaskan dan antarmuka IShellFolder folder Windows dirilis.