سؤال

أنا أستخدم Win32 :: API للاتصال بوظيفة شاملة تصديرها في DLL التي تقبل مؤشر هيكل C ++.

struct PluginInfo {
        int  nStructSize;   
        int  nType;     
        int  nVersion;    
        int  nIDCode;    
        char         szName[ 64 ];  
        char            szVendor[ 64 ];
        int  nCertificate;  
        int  nMinAmiVersion;
};

ونحن بحاجة إلى استخدام وظيفة "حزمة" لإنشاء الهيكل وتحتاج إلى تمرير حجة

my $name = " " x 64;
my $vendor = " " x 64;
my $pluginInfo = pack('IIIIC64C64II',0,0,0,0,$name,$vendor,0,0);

انها لا تبني الهيكل بشكل صحيح.
يبدو أن حجة الطول المطبقة على C سوف تهب تلك الحجج العديدة.
يمكن للبعض الآخر يرجى اقتراح أفضل طريقة لبناء نموذج الهيكل هذا PERL و PASSON إلى مكالمة DLL.

شكرا لك مقدما،
ناجا كيران

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

المحلول

يستخدم Z (خيط مبطن) في القالب الخاص بك، كما هو الحال في

my $pluginInfo = pack('IIIIZ64Z64II',0,0,0,0,$name,$vendor,0,0);

أيضا، إلقاء نظرة على Win32::API::Struct, ، وهو جزء من وحدة Win32 :: API.

نصائح أخرى

لأي شيء معقد، تحقق من تحويل :: ثنائي :: ج. وبعد قد يبدو الأمر شاقا في البداية، ولكن بمجرد أن تدرك قوتها، فإنها فتاحة العين.

تحديث: اسمحوا لي أن أضيف قليلا من المعلومات. تحتاج إلى إلقاء نظرة على قسم محدد من manpage الوحدة للسبب الرئيسي لاستخدامه. سأقتبسه للراحة:

لماذا استخدام تحويل :: ثنائي :: ج؟

قل أنك تريد حزمة البيانات (أو فك) وفقا لهيكل C:

struct foo {
  char ary[3];
  unsigned short baz;
  int bar;
};

يمكنك بالطبع استخدام وحزمة PERL و UPRACTS:

@ary = (1, 2, 3);
$baz = 40000;  
$bar = -4711;
$binary = pack 'c3 Si', @ary, $baz, $bar;

ولكن هذا يعني أن أعضاء البنية بايت محاذاة. إذا تم تنظيمها لفترة طويلة (وهو الافتراضي لمعظم المترجمين)، فستضطر إلى الكتابة

 $binary = pack 'c3 x S x2 i', @ary, $baz, $bar;

الذي لا يزيد من القراءة حقا.

الآن تخيل أنك تحتاج إلى حزم البيانات للحصول على بنية مختلفة تماما مع أمر بايت مختلف. سوف تنظر في حزمة ManPage مرة أخرى وربما تأتي مع هذا:

$binary = pack 'c3 x n x2 N', @ary, $baz, $bar;

ومع ذلك، إذا حاولت تفريغ $ Foo مرة أخرى، فقد تحولت قيمك الموقعة إلى غير موقعة.

كل هذا يمكن أن تدار مع بيرل. ولكن تخيل الهياكل الخاصة بك الحصول على أكثر تعقيدا؟ تخيل أنك بحاجة لدعم منصات مختلفة؟ تخيل أنك بحاجة إلى إجراء تغييرات على الهياكل؟ لن تضطر فقط إلى تغيير مصدر C ولكن أيضا عشرات سلاسل العبوات في رمز PERL الخاص بك. هذا ليس متعة. وينبغي أن تكون بيرل ممتعة.

الآن، ألا يكون الأمر رائعا إذا كنت تستطيع أن تقرأ فقط في المصدر C لقد كتبت بالفعل واستخدم جميع الأنواع المحددة هناك للتغليف والتفريغ؟ هذا ما تحويل :: ثنائي :: ج يفعل.

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