سؤال

وانشاء

لدي واجهة برمجة تطبيقات PDF التي لها وظيفة أصلية محددة أدناه.

typdef void* PDF_DOCUMENT;
unsigned long PDF_GetMetaText(PDF_DOCUMENT document,
                              const char tag, 
                              void* buffer, 
                              unsigned long bufferlen)

//Calling it "natively" in C++/CLI function to get the PDF Creator tag
WCHAR result[32];
void* pdoc = PDF_LoadDoc("C:\test.pdf");
int numChars = PDF_GetMetaText(pdoc, "Creator", result, 32);
PDF_CloseDoc(pdoc);

إذا اتصلت بالرمز أعلاه في وظيفة Wrapper C ++/CLI ، فإنها تُرجع السلسلة الصحيحة ولكنها ترمي AccessViolationException عندما أتصل بـ PDF_ClosedOC. Woops. لقد نسيت pin_ptr المؤشر المستند.

المشكلة

عندما أقوم بتوقيت PIN_PTR PDOC ، يمكنني استدعاء هذه الوظائف الأصلية بنجاح ، ومع ذلك لم يعد المخزن المؤقت يحتوي على سلسلتي عند إرجاع PDF_GETMETATEXT.

String^ Wrapper::GetCreator(String^ filename)
{
   WCHAR buffer[32];
   void *pdoc = PDF_LoadDoc(SystemStringToCStr(filename));
   pin_ptr<void*> p = &pdoc; //added
   int numPages = PDF_GetMetaText(p, "Creator", buffer, 32);
   PDF_CloseDocument(p); //doesnt crash, but at this line buffer is an empty string

   return gcnew String(buffer);
}

لقد حاولت أيضًا تثبيت المخزن المؤقت [0] ولكن هذا يسبب استثناء AccessViolation في getMetatext.

السؤال

لا أستطيع أن أقول ما يحدث في getMetatext ، لذلك لست متأكدًا مما يحدث إلى PDOC. أي اقتراحات للرمز أعلاه؟

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

المحلول

هذا لا معنى له. يمكنك فقط تثبيت الكائنات المدارة ، وهي قيمة إرجاع PDF_LOADDOC () بالتأكيد لا تبدو ككائن مُدار لي. الشيء نفسه ينطبق على نتيجة, ، ليست مُدارة array<WCHAR>, ، مجرد صفيف Vanilla C عادي يتم تخصيصه على إطار المكدس. لسوء الحظ ، لا يشكو PIN_PTR <> من هذا.

ال نتيجة لا يمكن أن تحصل الصفيف إلا على "فارغ" إذا كان الرمز يلبس إطار المكدس. والتي يمكنك تشخيصها عن طريق تعيين نقطة توقف البيانات على العنصر الأول. FWIW ، SystemstringTocstr () يبدو وكأنه مرشح. هذا لا يمكن أن يعمل دون إطلاق المخزن المؤقت للسلسلة الأصلية في مكان ما. مرشح آخر هو إعلانات وظيفة API PDF. انتبه إلى قيمة سجل ESP وتأكد من أنه لا يتغير. إذا كان الأمر كذلك ، فإن المكدس يصبح غير متوازن لأنه ليس لديك اتفاقية الاتصال المناسبة. الذي عادة ما يكون __stdcall لصادرات DLL.

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