2008-09-24 35 views
18

Tôi cần thay đổi chức năng của ứng dụng dựa trên tên thực thi. Không có gì lớn, chỉ cần thay đổi chuỗi được hiển thị và một số định danh nội bộ. Ứng dụng được viết trong một hỗn hợp của native và .Net C++ - mã CLI.Cách lấy tên thực thi ứng dụng trong WindowsC++/CLI?

Hai cách mà tôi đã xem xét là phân tích hàm GetCommandLine() trong Win32 và nhồi nhét xung quanh bằng AppDomain và các thứ khác trong .Net. Tuy nhiên, việc sử dụng GetCommandLine sẽ không phải lúc nào cũng hoạt động khi chạy từ trình gỡ rối dòng lệnh trống. Và công cụ .Net AppDomain dường như đòi hỏi nhiều thứ xung quanh.

Vậy cách tốt nhất/đơn giản nhất/hiệu quả nhất để xác định tên thực thi trong C++/CLI là gì? (Tôi hy vọng rằng tôi vừa bỏ lỡ điều gì đó đơn giản có sẵn trong .Net.)

Chỉnh sửa: Một điều mà tôi nên đề cập là đây là ứng dụng Windows GUI sử dụng C++/CLI, do đó không có quyền truy cập vào chức năng chính của kiểu C truyền thống, nó sử dụng chức năng Windows WinMain().

Trả lời

35

Gọi GetModuleFileName() sử dụng 0 làm tay cầm mô-đun.

Lưu ý: bạn có thể cũng sử dụng thông số argv [0] để gọi chính hoặc gọi GetCommandLine() nếu không có chính. Tuy nhiên, hãy nhớ rằng các phương thức này sẽ không nhất thiết cung cấp cho bạn đường dẫn đầy đủ đến tệp thực thi. Họ sẽ trả về cùng một chuỗi ký tự được sử dụng để bắt đầu chương trình. Gọi GetModuleFileName() sẽ luôn cung cấp cho bạn một đường dẫn đầy đủ & tên tệp.

8

Sử dụng đối số argv-main:

int main(int argc, char* argv[]) 
{ 
    printf("%s\n", argv[0]); //argv[0] will contain the name of the app. 
    return 0; 
} 

Bạn có thể cần quét chuỗi để loại bỏ thông tin thư mục và/hoặc tiện ích, nhưng tên sẽ có mặt ở đó.

+0

Giải pháp này có lợi thế nhất của việc cross-platform. –

+0

Có, mặc dù tôi không tìm kiếm một nền tảng chéo, chỉ một cho Windows sử dụng Win32 hoặc .Net. – Daemin

+3

Điều đó không hoạt động trong trường hợp chung. – tml

3

Có một phương pháp tĩnh trên Assembly sẽ nhận được nó cho bạn trong .NET.

Assembly.GetEntryAssembly().FullName 

Chỉnh sửa: Tôi không nhận ra rằng bạn muốn tên tập tin ... bạn cũng có thể nhận được rằng bằng cách gọi:

Assembly.GetEntryAssembly().CodeBase 

Điều đó sẽ giúp bạn có được đường dẫn đầy đủ để lắp ráp (bao gồm cả tên tệp).

+0

Trong khi điều này dường như là cách để đi ban đầu, nó thực sự không hoạt động trong thực tế, như tên lắp ráp là như nhau bất kể tên thực thi được thiết lập là gì. – Daemin

10

Câu trả lời của Ferruccio rất tốt. Dưới đây là một số mã ví dụ:

TCHAR exepath[MAX_PATH+1]; 

if(0 == GetModuleFileName(0, exepath, MAX_PATH+1)) 
    MessageBox(_T("Error!")); 

MessageBox(exepath, _T("My executable name")); 
+2

Từ msdn: 'Nếu hàm không thành công, giá trị trả về là 0 (không)' do đó ... bạn có thể muốn sử dụng '==' thay vì '! =' Trong câu lệnh điều kiện –

4

Sử dụng __argv [0]

+0

Câu trả lời đơn giản nhất và tốt nhất . – Benio

+0

Chỉ khi chương trình bắt đầu bằng 'main' hoặc' WinMain' và không phải 'wmain',' wWinMain'.Nếu "w" chính là điểm vào, thì '__wargv' phải được sử dụng. Chữ "argv" kia sẽ giữ nguyên. – Ajay

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