كيفية الحصول على إصدار Excel ومستوى أمان الماكرو

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

  •  29-09-2019
  •  | 
  •  

سؤال

قامت Microsoft مؤخرًا بتحطيم رمزنا منذ فترة طويلة (وأوصى به رسميًا) لقراءة إصدار Excel ومستوى أمان Omacro الحالي.

ما كان يعمل:

// Get the program associated with workbooks, e.g. "C:\Program Files\...\Excel.exe"
SHELLAPI.FindExecutable( 'OurWorkbook.xls', ...) 

// Get the version of the .exe (from it's Properties...)
WINDOWS.GetFileVersionInfo()

// Use the version number to access the registry to determine the security level
// '...\software\microsoft\Office\' + VersionNumber + '.0\Excel\Security'

(كنت دائمًا مستمتعًا بأن مستوى الأمن كان لسنوات في إدخال سجل غير آمن ...)

في Office 2010 ، ترتبط ملفات .xls الآن بـ "Microsoft Application Dde Launcher" أو SFTDDE.exe. من الواضح أن رقم إصدار هذا EXE ليس إصدار Excel.

سؤالي:

بخلاف إطلاق Excel فعليًا والاستعلام عنه إصدار و الأمان المستوى (باستخدام OLE CREATEOLOBJECT ('excel.application')) ، هل هناك طريقة أنظف أو أسرع أو أكثر موثوقية للقيام بذلك والتي ستعمل مع جميع الإصدارات التي تبدأ بـ Excel 2003؟

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

المحلول

يستخدم

function GetExcelPath: string;
begin
  result := '';
  with TRegistry.Create do
    try
      RootKey := HKEY_LOCAL_MACHINE;
      if OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe', false) then
        result := ReadString('Path') + 'excel.exe';
    finally
      Free;
    end;
end;

للحصول على اسم الملف الكامل لملف excel.exe. ثم استخدام GetFileVersionInfo كل عادة.

على حد علمي ، سيعمل هذا النهج دائمًا.

نصائح أخرى

باستخدام Ole CreateOleBject ('excel.application'))

يمكنك الحصول على إصدارات Excel المثبت باستخدام نفس مكان التسجيل ، والتي تستخدمها هذه الوظيفة. في الأساس ، يجب عليك استنساخ جزء كبير من رمز تسجيل الوظيفة هذا. يمكنك التجسس على استدعاء الوظيفة هذه بواسطة أدوات مثل Microsoft Process Monitor انظر أيضًا كيف يبحث Windows عن Excel المثبت - ثم للقيام بذلك بنفس الطريقة تمامًا.

عليك فتح السجل في HKEY_CLASSES_ROOT\ وتعداد جميع الفروع ، التي يبدأ اسمها بـ "excel.application".

على سبيل المثال في هذا ، لم يتم تثبيت Excel 2013 فقط ، وهذا يتوافق مع HKEY_CLASSES_ROOT excel.application.15

لكن على محطة عمل أخرى ، قمت بتثبيت Excel 2003 و Excel 2010 ، حيث أجريت اختبار تطبيقات XLSX المختلفة في هذين الاثنين ، لذلك لدي مفتاحان للتسجيل.

hkey_classes_root excel.application.12 hkey_classes_root excel.application.14

لذلك ، عليك تعداد كل تلك الفروع بهذا الاسم والنقطة والرقم.

ملاحظة: سيكون للمفتاح hkey_classes_root excel.application curver اسم "الافتراضي" excel ، ولكن ما يعنيه "الافتراضي" غامض عند تثبيت العديد من التفوق. قد تأخذ هذه القيمة الافتراضية ، إذا لم تهتم ، أو قد تقرر فكرتك الخاصة بما تختاره ، مثل إذا كنت تريد إصدار Excel الأقصى أو الحد الأدنى أو شيء من هذا القبيل.

ثم عندما يكون لكل فرع Excel المحدد قراءة المفتاح الافتراضي من الفرع الفرعي CLSID. يحب HKEY_CLASSES_ROOT\Excel.Application.15\CLSID لديه مفتاح مساوٍ ل{00024500-0000-0000-C000-000000000046} - جلب هذا الفهرس إلى متغير السلسلة.

ثم قم بالبحث الثاني - انتقل إلى فرع اسمه مثل HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer (استخدم فهرس الجلب)

إذا كان هذا الفرع موجودًا - قم بإحضار قيمة "المفتاح الافتراضي" المسمى للحصول على شيء مثل C:\PROGRA~1\MICROS~1\Office15\EXCEL.EXE /automation

النتيجة الأخيرة هي سطر الأوامر. يبدأ باسم الملف (غير مقبل في هذا المثال ، ولكن قد يكون في Quotes) ويتبعه سطر الأوامر الاختياري. لا تحتاج إلى سطر الأوامر ، لذلك يجب عليك استخراج commanlind الأولي ، ونقلت أم لا.

ثم عليك التحقق مما إذا كان هناك ملف exe هذا. إذا حدث ذلك - فيمكنك تشغيله ، إن لم يكن - تحقق من السجل لإصدارات Excel الأخرى.

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