استرجاع معلومات المنتج من غير مدارة تنفيذ التطبيق في C#/.صافي

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

  •  11-07-2019
  •  | 
  •  

سؤال

في C# ، فمن الممكن لاسترداد الجمعية المعلومات ذات الصلة مثل اسم المنتج إلى استخدام التفكير:

string productName = Assembly.GetCallingAssembly().GetName().Name;
string versionString = Assembly.GetCallingAssembly().GetName().Version.ToString();

كيف أفعل ما يعادلها إذا كان تنفيذ الجمعية هو مكتوب في غير مدارة C++ (أقول)?هل من الممكن ؟ نفترض أن لدي .صافي dll التي يتم الاحتكام إليه في التعليمات البرمجية غير المدارة عبر واجهة COM.

تحرير:
لجعل الأمور واضحة تماما, هذا هو السيناريو:

  • لدي تنفيذي مكتوب في غير مدارة C++
  • لدي dll في C#/.صافي
  • Dll يتم استدعاء من قبل للتنفيذ عبر واجهة COM
  • داخل .صافي dll أريد أن أكون قادرا على استرجاع المعلومات مثل اسم المنتج و نسخة من داعيا للتنفيذ.

ممكن ؟

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

المحلول

المشي المكدس ليس من الضروري معرفة ما هي العملية التي كنت في.يمكنك ببساطة جعل واحد Win32 API المكالمات:

HMODULE hEXE = GetModuleHandle(NULL);

وفقا وثائق هذه الدعوة:

إذا كانت هذه المعلمة فارغة ، GetModuleHandle إرجاع مقبض الملف المستخدمة في إنشاء عملية الاستدعاء (.ملف exe).

يمكنك تشغيل هذه الوحدة التعامل في الملف مع GetModuleFileName(), آخر معيار Win32 API.اسم الملف في يده ، ثم يمكنك استدعاء GetFileVersionInfo() لاسترداد VS_VERSIONINFO هيكل لهذا الملف.المعلومات التي تريدها هناك.

منذ الآن أنت في .صافي يمكن استخدام P/استدعاء التوقيعات GetModuleHandle(), GetModuleFileName().بالنسبة GetFileVersionInfo() يمكنك استخدام النظام.تشخيص.FileVersionInfo.

ولكن في الواقع أسهل طريقة للقيام بذلك هو من المحتمل أن العصا مع النظام.التشخيص مساحة, كل ما تحتاجه هو هناك.الاتصال النظام.تشخيص.العملية.GetCurrentProcess() العودة إلى كائن العملية لعملية كنت تعمل في.ثم يمكنك استرداد ProcessModule من MainModule مكان الإقامة.ProcessModule لديه خاصية تسمى FileVersionInfo.المعلومات التي تريدها هناك.

نصائح أخرى

يمكنك استخدام التعليمات البرمجية التالية في VB.Net لاسترداد تمديد خصائص المستند:

Sub Main()
    Dim arrHeaders(41)

    Dim shell As New Shell32.Shell
    Dim objFolder As Shell32.Folder

    objFolder = shell.NameSpace("C:\tmp\")

    For i = 0 To 40
        arrHeaders(i) = objFolder.GetDetailsOf(objFolder.Items, i)
    Next
    For Each strFileName In objfolder.Items
        For i = 0 To 40
            Console.WriteLine(i & vbTab & arrHeaders(i) & ": " & objFolder.GetDetailsOf(strFileName, i))
        Next
    Next

End Sub

إضافة COM مرجع إلى Microsoft قذيفة التحكم و الأتمتة إلى المشروع الخاص بك إلى تجميع.

إخراج البرنامج أعلاه سوف تكون قائمة بيانات التعريف المخصصة لجميع الملفات في C: mp مثل

0       Name: dpvoice.dll
1       Size: 208 KB
2       Type: Application Extension
3       Date Modified: 14.04.2008 04:41
4       Date Created: 14.04.2008 04:41
5       Date Accessed: 01.12.2008 09:56
6       Attributes: A
7       Status: Online
8       Owner: Administrators
9       Author:
10      Title:
11      Subject:
12      Category:
13      Pages:
14      Comments:
15      Copyright:
16      Artist:
17      Album Title:
18      Year:
19      Track Number:
20      Genre:
21      Duration:
22      Bit Rate:
23      Protected:
24      Camera Model:
25      Date Picture Taken:
26      Dimensions:
27      :
28      :
29      Episode Name:
30      Program Description:
31      :
32      Audio sample size:
33      Audio sample rate:
34      Channels:
35      Company: Microsoft Corporation
36      Description: Microsoft DirectPlay Voice
37      File Version: 5.3.2600.5512
38      Product Name: Microsoftr Windowsr Operating System
39      Product Version: 5.03.2600.5512
40      Keywords:

دعنا نفترض أنك بعد EXE/DLL PE header البيانات التي @ديفو دعوات العودة مثلاالشركة المنتج الخ...هذه راجع للشغل.مستمدة من استدعاء Win32 معلومات النسخة API - التفاصيل على MSDN:

http://msdn.microsoft.com/en-us/library/ms646981.aspx

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

إذا فشل ذلك - كنت في حاجة إلى التصحيح API للاسترخاء الخارجية كومة - أن يدخل قيود أخرى:

  • مرتفعة الأمن الأذونات المطلوبة لاجتياز المكدس
  • إمكانية تأثير الأداء الفك المكدس.

في مكالمة عن طريق الاتصال أساس أي من هذه يمكن أن تجعل المصحح نهج عملي.

التحديث

بعض البحوث تشير إلى أن هناك الكثير من الأخطاء gotchas للقراءة المكدس فوق الاتفاقية الانتقالية الإطار حتى في المصحح.على سبيل المثال

http://support.microsoft.com/kb/317221

مختلطة غير المدارة/تمكنت رمز القرار هو قبيح جدا - بعض الأفكار هنا على كيفية القيام بذلك...DaveBr بلوق على التصحيح رائع جدا جدا.

http://bytes.com/groups/net-vc/280340-stackwalk-callstack-symbol-resolve-managed-unmanaged-code-dbghelp-etc

http://blogs.msdn.com/davbr/archive/2005/10/06/478006.aspx

هناك الكثير من العلف عن الخطوات المتخذة التنظيم المكالمات بين المدارة/تمكن العملاء - على سبيل المثال ،

http://msdn.microsoft.com/en-us/library/ms973872.aspx

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