C # تمرير int و سلسلة بالرجوع إلى C ++ تحكم ActiveX: عدم تطابق نوع

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

سؤال

ولدي مشكلة يمر بها كثافة إشارة أو سلسلة المتغيرات C ++ تحكم ActiveX. أيضا أمرر هذه المتغيرات بالرجوع إلى DLL C ++ ويعمل كل شيء على ما يرام.

وDLL C ++:

__declspec (dllexport) void
Execute (LPCTSTR cmd, int& resultCode, LPCTSTR& message, long& receiptNumber)
{
    message = _T("ReplyProblem");
    resultCode = 100;
    receiptNumber = -1;
}

وC #:

[DllImport("MyCOM.dll", CharSet = CharSet.Unicode)]
public static extern void Execute (string cmd, out int resultCode, out string message, out int receiptNumber);
...
int resultCode = 0;
string message = "";
int receiptNumber = 0;
Execute ("cmd", out resultCode, out message, out receiptNumber); // OK

وكيفية تحقيق هذا في عنصر تحكم ActiveX؟ حاولت تحديد أساليب استخدام ورمز المرجعية، ولكن لم MIDL المترجم لا تسمح بذلك.

وMyCOM.idl:

[id(1025315)] void Execute (LPCTSTR cmd, [out]long& returnCode); // MIDL2025: syntax error

ولقد عدلت الطرق لاستخدام مؤشرات *.

وMyCOM.idl:

[id(1025315)] void Execute (LPCTSTR cmd, [out]long* returnCode);

وMyCOMCtrl.h:

// Dispatch maps
afx_msg void Execute (LPCTSTR cmd, long* resultCode);

وMyCOMCtrl.cpp

// Dispatch map
...
DISP_FUNCTION_ID(MyCOMCtrl, "Execute", DISPID_EXECUTE_METHOD, Execute, VT_EMPTY, VTS_PI4)
...

void MyCOMCtrl::Execute (LPCTSTR cmd, long* resultCode)
{
    *resultCode = 111;
}

وC #:

using MyCOMLib;
...
MyCOM client = new MyCOM();
int resultCode = 0;

// COMException: Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))
client.Execute ("Test command", out resultCode);

والاستثناء نفسه يحدث باستخدام نوع السلسلة في C # و LPCTSTR * في اكتف C ++ بدلا من ذلك. سيكون موضع تقدير أي نصائح أو اقتراحات.

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

المحلول

وحلها:

في MyCOMCtrl.cpp:

// Dispatch map
...
DISP_FUNCTION_ID(MyCOMCtrl, "Execute", DISPID_EXECUTE_METHOD, Execute, VT_EMPTY, VTS_PI4)
...

ويجب أن تكون:

DISP_FUNCTION_ID(MyCOMCtrl, "Execute", DISPID_EXECUTE_METHOD, Execute, VT_EMPTY, VTS_BSTR VTS_PI4) // two VTS arguments

نصائح أخرى

وهذه ليست سوى تسديدة بعيدة (لا يقصد التوريه)، ولكن حاول استخدام نوع البيانات "لفترة طويلة" بالنسبة لك. NET resultCode متغير.

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