2012-02-02 62 views
13

Có cách nào đơn giản để mở tệp bằng chương trình được liên kết trong cửa sổ không? (như nhấp đúp vào cửa sổ khám phá nhưng được thực hiện tự động với mã của tôi)Làm cách nào để mở tệp có chương trình được liên kết với phần mở rộng của tệp?

Ví dụ, trên máy tính A, "text.txt" sẽ được mở bằng wordpad nhưng trên máy tính B nó sẽ được mở bởi Notepad ++ người dùng tập tin phần mở rộng tập tin.

tôi đã cố gắng ShellExecute

ShellExecute(0, L"open", L"c:\\windows\\notepad.exe" ,L"c:\\outfile.txt" , 0 , SW_SHOW); 

mà làm việc nhưng nếu tôi bỏ qua các tham số notepad.exe những điều kỳ lạ xảy ra (một nhà thám hiểm ngẫu nhiên được hiển thị).

+0

Nếu bạn đã làm việc đó, câu hỏi là gì? –

Trả lời

19

Bạn muốn sử dụng file để mở như là đối số tập tin, không phải là lập luận tham số. Không cần phải chỉ định chương trình sẽ sử dụng, ShellExecute sẽ tìm kiếm chương trình đó cho bạn.

ShellExecute(0, 0, L"c:\\outfile.txt", 0, 0 , SW_SHOW); 

Bằng cách giữ động từ như NULL (0) chứ không phải là L"open", bạn sẽ có được hành động mặc định đúng đối với các loại tập tin - thường đây là open nhưng không phải lúc nào.

+0

Tôi phải mệt mỏi, cảm ơn điều đó! – Valmond

+0

Chỉ là một ví dụ: mspaint, không thể khởi chạy với "mở" –

2

Xem Launching Applications:

ShellExecute(NULL, "open", L"c:\\outfile.txt", NULL, NULL, SW_SHOW); 

Trên cửa sổ, một cái móc trí nhớ tốt là để suy nghĩ của tất cả các dữ liệu file bị thực thi bằng vỏ. Bạn cũng có thể thử nó trong một hộp lệnh, nơi bạn có thể chỉ cần gõ một tên tập tin, và nó sẽ được mở ra. Hoặc, theo cách khác, mọi tệp trong Windows có thể được mở và hành động mở mặc định cho các tệp thực thi là thực thi chúng.

0

Có thể thử bắt đầu thay vì mở?

+1

'mở' là động từ mặc định mà Explorer sử dụng khi bạn bấm đúp vào một tệp. Bạn có thể để tham số NULL để sử dụng mặc định thực cho kiểu tệp. –

1

Nếu lpFile xác định một tập tin tài liệu, cờ chỉ đơn giản là truyền cho các ứng dụng liên quan đến

Vì vậy, bạn cần phải thay thế "c:\\windows\\notepad.exe" với tập tin thực tế mà bạn muốn mở và để lại lpParameters null.

1

Theo MS Knowledge Base, ShellExecute nên làm việc (chúng tôi làm điều này trong Delphi tất cả các thời gian):

ShellExecute(Handle, "Open", Filename, "", "C:\", SW_SHOWNORMAL) 
1

Một chút nhiều khả năng ở đây:

Nếu bạn muốn mở - ví dụ - các tập tin theo mặc định với Notepad ++ (nếu được cài đặt), bạn có thể quét cho nó là chìa khóa registry nếu nó tồn tại và nó ở đâu, (Thông thường HKLM\SOFTWARE\Wow6432Node\Notepad++ [thử nghiệm Win7]) sau đó đi theo con đường đó và mở nó.

std::wstring file = L"C:\\Outfile.txt";

if (NotepadPlusPlusExists()) //Open with Notepad++ or use an other program... (maybe your own ?) 
{ 
    std::wstring wsNPPPath = GetNotepadPlusPlusPath(); 
    ShellExecuteW(HWND, L"open", wsNPPPath.c_str(), file.c_str(), NULL, SW_NORMAL); 
} 
else //Open with default associated program <--- 
    ShellExecuteW(HWND, NULL, file.c_str(), NULL, NULL, SW_NORMAL); 

Nếu bạn muốn người dùng để có thể thay đổi chương trình mặc định hoặc chọn một chương trình anh/cô ấy muốn sử dụng, bạn có thể mở "Open with" hộp thoại.

//std::wstring StringArgsW(const wchar_t *format, ...); 
std::wstring wsCmdOpenWith = StringArgsW(L"C:\\Windows\\system32\\shell32.dll,OpenAs_RunDLL \"%s\"", file.c_str()); 
ShellExecuteW(HWND, L"open", L"C:\\Windows\\system32\\rundll32.exe", wsCmdOpenWith.c_str(), NULL, SW_NORMAL); 

Bạn cũng có thể mở tệp trong trình khám phá.

std::wstring wsCmdExplorer = StringArgsW(L"/select,\"%s\"", file.c_str()); 
ShellExecuteW(HWND, L"open", L"explorer.exe", wsCmdExplorer.c_str(), NULL, SW_NORMAL); 
Các vấn đề liên quan