2016-03-22 20 views
1

Yani, kısaca, benim durumumda - Steam ile fırlatma seçenekleri olan bir program başlatmam gerekiyor. Benim küçük programın başlangıcında, onu başlatmak için system() kullandım, şimdi ShellExecute() ile başlatmak istiyorum, ama hiçbir şey yapmıyor. Herhangi bir yardım takdir edilecektir. ShellExecute çalışmıyor veya yanlış bir şey mi yapıyorum?

Kodum:

#define STEAM_DIRECTORY "\"D:\\Programs\\Steam\\steam.exe\"" 

int main() 
{ 
    .... 
    string runsteam_arg = STEAM_DIRECTORY; 
    runsteam_arg = runsteam_arg + " -login " + login[num - 1] + " " + pass[num - 1]; 
    system(runsteam_arg.c_str()); 
} 

Düzenleme:

#include <Windows.h> 
#define STEAM_DIRECTORY "D:\\Programs\\Steam\\steam.exe" 

int main() 
{ 
    .... 
    string arguments = "- login " + login[num - 1] + " " + pass[num - 1]; 
    ShellExecute(NULL, (LPCWSTR)"open", (LPCWSTR)STEAM_DIRECTORY, (LPCWSTR)arguments.c_str(), NULL, SW_SHOWMINIMIZED); 
} 

Daha önce kullandım ne

"D:\Programs\Steam\steam.exe" -login xxxx xxxx  

Ve bir şey daha: Eninde sonunda çalıştırmak için gerekenler , birisi CoInitializeEx()'un ne yaptığını açıklayabilir mi? Windows API’da yeniyim.

+6

olanlar (LPCWSTR) atmalarını sadece zaman yanlış yaptıklarını belirten gelen derleyici durdu, o yaptı yanlış yapmanı engellemem. L "açık" gibi bir Unicode literal oluşturmak için önek L. Veya ShellExecuteA() kullanın. Ve bir winapi işlevinin dönüş değerini göz ardı etmeyin. –

cevap

2

İşaretçilerle (LPCWSTR) işaretlerini yazmak yeterli değil, dizeyi ANSI'den Unicode'a dönüştürmeniz gerekiyor.

Bunun yerine en basit çözüm (ancak en iyi değil), ShellExecuteA'u aramak olacaktır.

#include <Windows.h> 
#define STEAM_DIRECTORY "D:\\Programs\\Steam\\steam.exe" 

int main() 
{ 
    .... 
    string arguments = "- login " + login[num - 1] + " " + pass[num - 1]; 
    ShellExecuteA(NULL, "open", STEAM_DIRECTORY, arguments.c_str(), NULL, SW_SHOWMINIMIZED); 
} 

Alma gerçek Unicode dizeleri L"str" yerine "str" yazacağınızı gerektirecektir. Ve string yerine wstring kullanmanız gerekir.

#include <Windows.h> 
#define STEAM_DIRECTORY L"D:\\Programs\\Steam\\steam.exe" 

int main() 
{ 
    .... 
    wstring arguments = L"- login " + login[num - 1] + L" " + pass[num - 1]; 
    ShellExecuteW(NULL, L"open", STEAM_DIRECTORY, arguments.c_str(), NULL, SW_SHOWMINIMIZED); 
} 

Ayrıca: ile örneğin ShellExecute(Ex) kullanmadan önce CoInitialize() unutmayın:

const HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); 
+0

Güncelleme ana sayfası. –

+0

CoInitializeEx, COM (Bileşen Nesne Modeli sistemi) başlatır. Windows'un, Shell gibi bazı kısımları COM kullanıyor ve bu nedenle başlatılmaya bağlı. –

+0

Bu, ShellExecute() belgelerinde açıkça belirtilmiştir: "* ShellExecute, Bileşen Nesne Modeli (COM) kullanılarak etkinleştirilen Shell uzantılarına (veri kaynakları, içerik menüsü işleyicileri, fiil uygulamaları) yürütme yetkisi verebildiğinden, COM başlatılmalıdır ShellExecute çağrılmadan önce ... ShellExecute'un bu Shell uzantı türlerinden birini kullanamadığı durumlar vardır ve bu örnekler COM'un başlatılmasını gerektirmez. Yine de, bu işlevi kullanmadan önce COM'u her zaman başlatmanız iyi bir uygulamadır. . *" –

İlgili konular