2010-10-22 17 views
15

thể trùng lặp:
How to get the application executable name in Windows (C++ Win32 or C++/CLI)?Làm cách nào để có thể lấy tên tệp thực thi của cá thể hiện tại từ ứng dụng gốc win32 C++?

Làm thế nào tôi có thể nhận được đường tên file & trường hợp hiện tại của từ bên trong ứng dụng C++ win32 mẹ đẻ của tôi?

Ví dụ; nếu ứng dụng của tôi là c: \ dự án \ testapps \ getapppath.exe nó sẽ có thể cho biết con đường là c: \ dự án \ testapps \ getapppath.exe

Trả lời

28

Bạn có thể làm điều này thông qua GetModuleFileName chức năng.

TCHAR szFileName[MAX_PATH + 1]; 

GetModuleFileName(NULL, szFileName, MAX_PATH + 1) 
+0

Vậy đó. Tôi biết nó là một cái gì đó đơn giản. –

3

GetCurrentProcess, sau đó QueryFullProcessImageName

câu trả lời khác là tốt hơn cho quá trình của riêng bạn - điều này được ưu tiên cho những người thân ở xa. Mỗi the docs:

Để lấy tên mô-đun của quá trình hiện , sử dụng chức năng GetModuleFileName với một NULL mô-đun xử lý. Điều này hiệu quả hơn hơn là gọi hàm GetProcessImageFileName với một xử lý cho quy trình hiện tại.

Để truy xuất tên của mô-đun chính thực thi cho quy trình từ xa ở định dạng đường dẫn win32, hãy sử dụng hàm QueryFullProcessImageName.

1

UPDATE: Chỉ hoạt động cho giao diện điều khiển các ứng dụng!

Đường dẫn của chương trình được chuyển làm đối số đầu tiên, Nó được lưu trữ trong argv[0] trong hàm main(argc, argv[]).

+5

Không, không. Windows chuyển chuỗi tham số chưa sửa đổi được chuyển thành tham số thứ 2 cho CreateProcess. Nó có thể chứa bất cứ thứ gì cả. Nếu chỉ có 1 chuỗi được truyền cho CreateProcess, thì nó sẽ tìm đường dẫn tới exe trong argv [0] - nhưng đường dẫn không phải là chuẩn theo bất kỳ cách nào - chỉ cần thỏa mãn hàm SearchPath. Chắc chắn nó là một quy ước, nhưng không có gì đảm bảo rằng argv [0] chứa bất cứ điều gì từ xa có thể sử dụng được. –

+1

Đó là những gì tôi đã suy nghĩ, nhưng chữ ký của winmain của tôi là int APIENTRY _tWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) –

+0

Ngoại trừ nếu một trong ba posix gọi execl, execle hoặc execlp được sử dụng để bắt đầu chương trình, bạn đang ở lòng thương xót của chương trình mà làm cho exec gọi cho giá trị trong argv [0]. –

0

Tested:

int _tmain(int argc, _TCHAR *argv[]) 
{ 
    _tprintf(L"%s", argv[0]); 
    return 0; 
} 

In đường dẫn đầy đủ.

+1

tính năng này không hoạt động cho các ứng dụng GUI (với WinMain) –

+0

Đúng. @ Garett của giải pháp làm việc cho điều đó. – egrunin

Các vấn đề liên quan