كيفية الحصول على تطبيق الاسم القابل للتنفيذ في WindowsC++/CLI ؟

StackOverflow https://stackoverflow.com/questions/124886

  •  02-07-2019
  •  | 
  •  

سؤال

أنا بحاجة إلى تغيير وظيفة التطبيق على أساس الاسم القابل للتنفيذ.شيء كبير, مجرد تغيير السلاسل التي يتم عرضها و بعض الداخلي معرفات.التطبيق هو مكتوب في خليط من مواطن .Net C++-CLI رمز.

اثنين من الطرق التي بحثت في تحليل GetCommandLine() وظيفة في Win32 و حشو حولها مع AppDomain وغيرها من الأمور .صافي.ومع ذلك باستخدام GetCommandLine لن تعمل دائما عند تشغيل من المصحح سطر الأوامر فارغة.و .صافي AppDomain الأشياء يبدو أن تتطلب الكثير من حشو جميع أنحاء.

فما هو أجمل/أبسط/أنجع وسيلة تحديد الاسم القابل للتنفيذ في C++/CLI ؟ (أنا أتمنى ذلك لقد غاب عن شيء بسيط ما هو متاح في .Net.)

تحرير:الشيء الوحيد الذي أود أن أشير إليه هو أن هذا هو ويندوز واجهة المستخدم الرسومية تطبيق باستخدام C++/CLI, ولذلك لا يوجد الوصول إلى التقليدية ج نمط الوظيفة الرئيسية يستخدم Windows WinMain() وظيفة.

هل كانت مفيدة؟

المحلول

الاتصال GetModuleFileName() باستخدام 0 وحدة نمطية التعامل معها.

ملاحظة:لك يمكن أيضا استخدام argv[0] المعلمة الرئيسية أو الاتصال GetCommandLine() إذا لم يكن هناك الرئيسي.لكن, نضع في اعتبارنا أن هذه الطرق لا تعطي بالضرورة أنك المسار الكامل إلى الملف القابل للتنفيذ.وسوف يعيد نفسه سلسلة من الأحرف التي تم استخدامها لبدء تشغيل البرنامج.داعيا GetModuleFileName() دائما تعطيك كامل المسار اسم الملف.

نصائح أخرى

فيروتشيو الجواب هو جيد.هنا بعض التعليمة البرمجية الموجودة في المثال:

TCHAR exepath[MAX_PATH+1];

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

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

استخدام argv حجة main:

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

قد تحتاج إلى مسح سلسلة لإزالة دليل المعلومات و/أو امتداد ، ولكن الاسم سوف يكون هناك.

استخدام __argv[0]

هناك أسلوب ثابت على الجمعية التي سوف تحصل عليه في .صافي.

Assembly.GetEntryAssembly().FullName

تحرير:لم أكن أدرك أن كنت تريد اسم الملف...يمكنك أيضا الحصول على ذلك عن طريق الدعوة:

Assembly.GetEntryAssembly().CodeBase

التي سوف تحصل على المسار الكامل إلى الجمعية العامة (بما في ذلك اسم الملف).

أستطيع أن أؤكد أنه يعمل تحت win64/visual studio عام 2017/ MFC

TCHAR szFileName[MAX_PATH + 1];
GetModuleFileName(NULL, szFileName, MAX_PATH + 1);
auto exe = CString(szFileName);

exe يحتوي على المسار الكامل إلى exe.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top