سؤال

لدي واجهة COM مع الطريقة التالية تعريف (IDL التدوين):

SCODE GetText( [in, out] ULONG* pcwcBuffer,
              [out, size_is(*pcwcBuffer)] WCHAR* awcBuffer );

عناصر تنظيم يتم استخدام COM+ ، مكتبة النوع يتم تسجيل أساليب أخرى من واجهة العمل حسنا عندما دعا من خلال COM+ ، ولكن ليس هذا الأسلوب.

جانب الملقم نسخ مجموعة من WCHARs في awcBuffer و طوله إلى pwcBuffer, لا المخزن المؤقت تجاوز يحدث من أي وقت مضى.

static const wchar_t* Text = L"Sample";
STDMETHODIMP CImpl::GetText( ULONG* bufferLength, WCHAR* buffer )
{
    const int length = wcslen( Text );
    *bufferLength = length;
    memcpy( buffer, Text, length * sizeof( WCHAR ) );
    return S_OK;
}

عندما يدعو العميل هذا الأسلوب من خلال COM+ العازلة محتويات يضيع.على وجه التحديد إلا أن الأول واسعة شار محفوظة - إذا كان الملقم نسخ "عينة" على نطاق واسع سلسلة الأحرف العميل يتلقى فقط "S" سلسلة.قيمة الإرجاع على العميل حجم S_OK ، العازلة طول إرجاعها إلى العميل هو بالضبط نفس ما الملقم نسخها.

وأخيرا تحولت إلى BSTR إلى حل هذه المشكلة ولكن انها مثيرة للاهتمام حقا لماذا كل صالحة تبحث بناء لا يعمل.

ما هي الأسباب المحتملة من وصف السلوك ؟

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

المحلول

وIIRC، يتجاهل marshaller typelib السمة size_is - وبالتالي، يتم تنظيم سوى 1 شار

.

نصائح أخرى

J. يمر هو الصحيح. لmarshaller typelib للعمل، يجب أن يكون واجهة COM OLE أتمتة متوافق. يتم تطبيق marshaller typelib في الملف Oleaut32.dll، لذلك أعتقد أن هناك فكرة في الاسم.

[size_is] صحيح تماما IDL، ويجمع إلى typelib صحيح، ولكن منظم typelib فقط يمكن التعامل مع مجموعة فرعية من واجهات صالحة. عادة ما يشار أن مجموعة فرعية باسم أتمتة OLE. بوصفها جانبا، يمكن للعملاء VB6 يتحدث فقط أتمتة OLE، لذلك فإنها لن تكون قادرة على استهلاك واجهة الخاص بك أيضا.

وحاول بمناسبة اجهة الخاص بك مع [oleautomation] السمة في IDL الخاص بك. وينبغي أن تعطي لك رسالة تحذير أو الخطأ التي قد تشير لك لمزيد من المعلومات حول هذا الموضوع.

في COM "طبيعية"، هل يمكن أن تولد وكيل / كعب DLL من IDL الخاص للقيام التنظيم، ولكن أخشى أنا لا أتذكر ما إذا كان COM + ستستخدم كود التنظيم العرف الخاص بك حتى لو كنت عناء لبنائه .

تحديث: في كتابه "COM و. NET خدمات المكونات" جوفال لووي، وأنا وجدت هذا البيان: "<م> ... مكونات تكوين لا يمكن استخدام الواجهات التي تتطلب مخصصة التعبئة ". لذا أعتقد أن واجهة ستعمل أبدا في COM +. إذا كنت تستطيع، وإعادة الكتابة إلى استخدام BSTR بدلا من ذلك.

بعض الأسئلة:

  • لماذا لا تستخدم BSTR?
  • هل لديك مصادر GetText وظيفة ؟
  • ما هو حجم المخزن المؤقت عاد من خلال وظيفة ؟
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top