سؤال

هل من الممكن إلغاء تراكم أسماء مثل هذه في دلفي؟ إذا كان الأمر كذلك ، فأين أحصل على مزيد من المعلومات؟

مثال على رسالة خطأ حيث لا يمكن العثور على إدخال معين في DBRTL100.BPL أريد أن أعرف الوظيفة الدقيقة التي لا يمكن العثور عليها (الوحدة ، الفئة ، الاسم ، المعلمات ، إلخ).

---------------------------
myApp.exe - Entry Point Not Found
---------------------------
The procedure entry point @Dbcommon@GetTableNameFromSQLEx$qqrx17System@WideString25Dbcommon@IDENTIFIEROption could not be located in the dynamic link library dbrtl100.bpl. 
---------------------------
OK   
---------------------------

أعلم أن هذه هي الطريقة التي getTablenameFromSqlexlex في وحدة DBCommon (لدي Delphi مع مصادر RTL/VCL) ، ولكن في بعض الأحيان أصطدم بالتطبيقات التي لا تتوفر فيها كل التعليمات البرمجية (نعم ، يجب على العملاء دائمًا شراء جميع التعليمات البرمجية المصدرية للطرف الثالث الأشياء ، لكن في بعض الأحيان لا يفعلون ذلك).

لكن قل هذا مثالاً ليس لدي رمز من أجله ، أو فقط ملفات الواجهة (bde.int أي شخص؟) ما هي المعلمات التي لديها (أي ما هي الحمل الزائد المحتملة)؟ ما نوع العودة الذي لديه؟

هل هذا يشبه أي إصدار دلفي؟

-جيرون

تحرير 1:

بفضل روب كينيدي: tdump -e dbrtl100.bpl عمل الحيلة. لا حاجة الى على الاطلاق:

C:\WINDOWS\system32>tdump -e dbrtl100.bpl | grep GetTableNameFromSQLEx
File STDIN:
00026050 1385 04AC __fastcall Dbcommon::GetTableNameFromSQLEx(const System::WideString, Dbcommon::IDENTIFIEROption)

تحرير 2:

بفضل Tondrej الذي وجد هذا مقال EDN الألماني (ترجمة جوجل الإنجليزية). تصف هذه المقالة التنسيق بدقة ، ويجب أن يكون من الممكن إنشاء بعض رمز Delphi لإلغاء توصيل هذا.

بيتي أن الموقع الذي يذكره المؤلف (والبريد الإلكتروني) قد مات الآن ، ولكن من الجيد معرفة هذه المعلومات.

-جيرون

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

المحلول

لا توجد وظيفة يتم توفيرها مع Delphi من شأنها أن تضع أسماء الوظائف ، وأنا لست على علم بتوثيقها في أي مكان. دلفي باختصار يذكر أن الأداة المساعدة "tdump" لها أ التبديل لجعلها لا تشعل الرموز التي يجدها. انا لم اجربها مطلقا من قبل.

tdump -um -e dbrtl100.bpl

إذا لم ينجح ذلك ، فلا يبدو أنه مخطط معقد للغاية لإلغاء توصيل نفسك. من الواضح أن الاسم يبدأ بـ "@" ويتبعه اسم الوحدة واسم الوظيفة ، مفصولة بعلامة "@" أخرى. يتبع اسم الوظيفة هذا "$ QQRX" ثم أنواع المعلمات.

يتم ترميز أنواع المعلمات باستخدام عدد الأحرف من اسم النوع متبوعًا بنفس التنسيق "@"-محدد من قبل.

يعد "$" ضروريًا لتمييز نهاية اسم الوظيفة وبدء أنواع المعلمات. الغموض المتبقي هو الجزء "QQRX". هذا ما كشفته المقال وجدت توندريج. يشير "QQR" إلى اتفاقية الاتصال ، والتي في هذه الحالة تسجيل, ، الملقب ب fastcall. ينطبق "X" على المعلمة ويعني أنها ثابتة.

لا يحتاج نوع الإرجاع إلى تشفيره في اسم الوظيفة المشوهة لأن التحميل الزائد لا يعتبر أنواع الإرجاع على أي حال.

نصائح أخرى

انظر أيضا هذه المقالة (في المانيا). أظن أن الانتشار على الأرجح متوافق مع التخلف ، ويتم تقديم مخططات mangling الجديدة في إصدارات دلفي اللاحقة لميزات اللغة الجديدة.

إذا كان لديك C ++ Builder ، تحقق من $ (BDS) Source cpprtl source misc unmangle.c - فهو يحتوي على الكود المصدر لآلية unmangling المستخدمة من قبل TDUMP ، وتصحيح الأخطاء والرابط. (C ++ Builder و Delphi يستخدمان نفس مخطط التشويش.)

من ملفات مصدر Delphi 2007:

function GetTableNameFromSQLEx(const SQL: WideString; IdOption: IDENTIFIEROption): WideString;

يبدو أن هذا هو نفس الإصدار ، حيث لدي أيضًا نفس .BPL في مجلد Windows System32 الخاص بي.

يمكن العثور على المصدر في [مجلدات ملفات البرامج] codegear rad studio 5.0 source win32 db

استخدم Borland/Codegear/Embarcadero هذا الترميز لفترة من الوقت الآن ولم يعط الكثير من التفاصيل حول تنسيق .bpl. لم أكن مهتمًا بها أبدًا لأنني أكره استخدام مكتبات وقت التشغيل في مشاريعي. أفضل تجميعها في مشاريعي ، على الرغم من أن هذا سيؤدي إلى أكبر بكثير من التنفيذيين.

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