Rundll.exe

Microsoft Windows 95, Windows 98 ve Windows Millennium Edition (Me), 16 bit veya 32 bit bir DLL dosyasından verilen işlevi çağırmanıza olanak tanıyan Rundll.exe ve Rundll32.exe adlı iki komut satırı yardımcı programı içerir. Ancak, Rundll ve Rundll32 programları herhangi bir DLL dosyasından verilen işlevleri çağırmanıza izin vermez. Örneğin, bu yardımcı programları, sistem DLL'lerinden verilen Win32 API (Uygulama Programlama Arabirimi) çağrılarına yönelik olarak kullanamazsınız. Programlar yalnızca açıkça onları çağırmak üzere yazılmış bir DLL'deki işlevleri çağırmanıza izin verir. Bu makalede, yukarıda listelenen Windows işletim sistemlerinde Rundll ve Rundll32 programlarının kullanımı ile ilgili daha ayrıntılı bilgiler sağlanır.

Microsoft Windows NT 4.0, Windows 2000 ve Windows XP yalnızca Rundll32 ile birlikte gelir. Bu platformların hiçbirinde Rundll (Win16 yardımcı programı) desteği bulunmamaktadır.

Rundll ve Rundll32 yardımcı programları, gerçekte Microsoft'ta iç kullanım amacıyla tasarlanmıştır. Ancak, sağladıkları işlevsellik yeterince genel olduğu için genel kullanıma sunulmuştur. Windows NT 4.0'ın yalnızca Rundll32 yardımcı programıyla birlikte geldiğini ve yalnızca Rundll32'yi desteklediğini unutmayın.

Daha fazla bilgi Rundll ile Rundll32 karşılaştırması Rundll 16 bir DLL dosyalarını, Rundll32 ise 32 bit DLL dosyalarını yükler ve çalıştırır. Rundll veya Rundll32'ye yanlış DLL türünü geçirirseniz, bu dosya herhangi bir hata iletisi görüntülemeden başarısız olabilir.

Rundll komut satırı Rundll komut satırı aşağıdaki gibidir:

RUNDLL.EXE <dlladı>,<girişnoktası> <isteğe bağlı bağımsız değişkenler>Aşağıda, bir örnek gösterilmektedir:
RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF

Yukarıdaki komut satırında 3 noktaya dikkat etmelisiniz: 1. Rundll veya Rundll32, belirtilen DLL dosya adını standart konumlarda arar (LoadLibrary() işlevi ile ilgili ayrıntılar için belgelere bakın). Doğru DLL dosyasının bulunmasını sağlamak için dosyanın tam yolunu belirtmeniz önerilir. En iyi sonuç için, uzun dosya adı yerine kısa dosya adını kullanarak geçersiz karakterlerin görüntülenmemesini sağlayın. Bu amaçla, "C:\Program Files" klasöründeki bir DLL dosyasının kısa adına dönüştürülmesi gerektiğini unutmayın. 2. <Dlladı> boşluk, virgül veya tırnak işareti içeremez. Bu, Rundll komut satırı ayrıştırıcısında bulunan bir kısıtlamadır. 3. Yukarıdaki komut satırında, <dlladı> ve <girişnoktası> işlev adları arasındaki virgül işareti (,) çok önemlidir. Virgül ayırıcısı yoksa, Rundll veya Rundll32 herhangi bir hata görüntülemeden başarısız olur. Ayrıca, <dlladı>, virgül işareti ve <girişnoktası> işlevi arasında boşluk bulunamaz.

Rundll Nasıl Çalışır Rundll aşağıdaki adımları gerçekleştirir: 1. Komut satırını ayrıştırır. 2. Belirtilen DLL dosyasını LoadLibrary() aracılığıyla yükler. 3. <Girişnoktası> işlevinin adresini GetProcAddress() aracılığıyla edinir. 4. <Girişnoktası> işlevini çağırır ve komut satırının sonunda bulunan <isteğe bağlı bağımsız değişkenleri> geçirir. 5. <Girişnoktası> işlevi döndürüldüğünde, Rundll.exe, DLL dosyasının yüklemesini kaldırır ve çalışmasını sonlandırır.

DLL Dosyanızı Yazma DLL dosyanızda, <girişnoktası> işlevini aşağıdaki prototipe göre yazın:

16-bit DLL:
 void FAR PASCAL __loadds
 GirişNoktası(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);

32-bit DLL:
 void CALLBACK
 GirişNoktası(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);

Yine, GirişNoktası işlevinde 3 noktaya dikkat etmelisiniz: 1. Kuşkusuz, "GirişNoktası" adı yerine, giriş noktası işlevinizin asıl adını kullanmalısınız. Rundll32'nin giriş noktasının, bir 32 bit DLL dosyasındaki, işlemi ve iş parçacığı ekleme/kaldırma bildirimlerini gerçekleştiren DllEntryPoint işleviyle ilişkisi bulunmadığını unutmayın. 2. Rundll32 için giriş noktası işlevinin _stdcall çağrı kuralı ile tanımlanması gerekir (CALLBACK varsayılan olarak _stdcall özniteliğini kullanır). _stdcall özniteliği eksikse, işlev varsayılan olarak _cdecl çağrı kuralını kullanır ve Rundll32, işlevi çağırdıktan sonra beklenmedik biçimde sonlandırılır. 3. İşlevi yukarıda açıklandığı gibi _stdcall çağrı kuralıyla bildirmeniz gerektiği için, DLL C ile yazılmışsa Visual C++ derleyicisi bu dosyayı _GirişNoktası@16 olarak veya C++ ile yazılmışsa başka bir ad düzenlemesiyle verir. Bu nedenle, Rundll veya Rundll32 için komut satırında doğru verilen adı kullanmaya dikkat edin. Düzenlenmiş adlar kullanmaktan kaçınmak istiyorsanız, bir .def dosyası kullanın ve giriş noktası işlevini ada göre verin. Visual C++ derleyiciler kullanırken ad düzenlemesi konusunda daha fazla bilgi için ürün belgelerine ve aşağıdaki makaleye başvurun: 140485 32 Bit DLL Dosyalarında PASCAL Benzeri Simgeleri Verme (Bu bağlantı, bir kısmı veya tamamı İngilizce olan içeriğe işaret edebilir.)

Rundll giriş noktasının parametreleri aşağıdaki gibidir:

hwnd - DLL dosyanızın oluşturduğu tüm pencereler için pencere sahibiolarak kullanılması gereken pencere tanıtıcısıhinst - DLL dosyanızın örnek tanıtıcısılpszCmdLine - DLL dosyanızın ayrıştırması gereken ASCIIZ komut satırınCmdShow - DLL dosyası pencerelerinin nasıl görüntülenmesi gerektiğini açıklar

Aşağıdaki örnekte:

RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF

Rundll, Setupx.dll dosyasındaki InstallHinfSection() giriş noktası işlevini çağırır ve bu işleve aşağıdaki parametreleri geçirir:

hwnd = (ana pencere tanıtıcısı)hinst = HINSTANCE of SETUPX.DLLlpszCmdLine = "132 C:\WINDOWS\INF\SHELL.INF"nCmdShow = (CreateProcess için hangi nCmdShow geçirilmişse)

Kendi komut satırını (yukarıdaki lpszCmdLine parametresini) ayrıştırması ve bağımsız parametreleri gerekli şekilde kullanması gerekenin <girişnoktası> işlevi (veya yukarıdaki örnekte InstallHinfSection()) olduğunu unutmayın. Rundll.exe yalnızca komut satırına geçirilen isteğe bağlı bağımsız değişkenlere kadar ayrıştırır. Ayrıştırma işleminin bundan sonrası <girişnoktası> işlevine kadardır.

Windows 95 ve Windows NT Arasındaki Farklılıklar ile İlgili Özel Notlar Windows NT, Windows 2000 ve Windows XP'de, Rundll32.exe davranışı UNICODE komut satırlarını içerecek biçimde biraz farklıdır.

Windows NT öncelikle <EntryPoint>W için GetProcAddress işlevini gerçekleştirmeye çalışır. Bu giriş noktası bulunursa, prototipin aşağıdaki gibi olduğu varsayılır:

void CALLBACKGirişNoktası(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,int nCmdShow);

Bu, lpszCmdLine parametresinin artık bir UNICODE dizesi olması dışında ANSI GirişNoktası ile aynıdır.

<EntryPoint>W giriş noktası bulunmazsa, Windows NT, <girişnoktası>A ve <girişnoktası> için GetProcAddress işlevini kullanır. Bunlardan biri bulunursa, ANSI giriş noktası olarak nitelendirilir ve Windows 95/98/Me ile aynı şekilde kullanılır. Bu nedenle, DLL dosyanızın Windows 95'te ANSI desteğiyle ve Windows NT/2000/XP'de UNICODE desteğiyle çalışmasını isterseniz iki işlevi vermelisiniz: EntryPointW ve EntryPoint. Windows NT/2000/Me'de, EntryPointW işlevi bir UNICODE komut satırıyla çağrılır; Windows 95/98/Me'de, EntryPoint işlevi bir ANSI Komut satırı ile çağrılır.

Üste Referanslar Rundll kullanımına yönelik bir örnek için, Windows 95'te Rundll komut satırı yardımcı programını kullanarak bir Denetim Masası Uygulaması başlatma ile ilgili olan aşağıdaki makaleye başvurun: 135068 NASIL YAPILIR: Windows 95, 98 veya WinNT'de Bir Denetim Masası Uygulaması Başlatma (Bu bağlantı, bir kısmı veya tamamı İngilizce olan içeriğe işaret edebilir.)