كيف يمكنني الحصول على كائن من عنوان المؤشر

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

  •  21-12-2019
  •  | 
  •  

سؤال

لقد كتبت عنصر تحكم المستخدم لـ WinCC (Siemens) (SCADA).الآن أريد تمرير مؤشر إلى عنصر التحكم.الطريقة الوحيدة للقيام بذلك هي:اكتب المؤشر إلى خاصية.

لدى WinCC هذه الطرق فقط لتعيين الخصائص

  • SetPropBOOL
  • SetPropChar
  • SetPropDouble
  • SetPropWord

تحتوي الخاصية من التحكم على UInt كنوع بيانات وأستخدم طريقة SetPropDouble لتعيين العنوان من كائن.

البرنامج النصي العالمي WinCC (ANSI-C)

//autoDB is an ADODB.Connection object
//object* autoDB = __object_create("ADODB.Connection");
extern __object* autoDB;
//SetPropDouble( "PictureName", "ControlName", "PropertyName", (DWORD)(&autoDB) );
SetPropDouble( "PictureName", "ControlName", "PropertyName", (DWORD)autoDB );

لقد قمت بتصحيح أخطاء التحكم الخاصة بي (ربط عملية WinCC) وأرى أن مجموعة الخصائص قد تم تعيين قيمة عنوان لها على سبيل المثال.0x03041080.

والآن السؤال:كيف يمكنني الحصول على الكائن في c# (.Net) على العنوان؟

محاولتي تلقي استثناءً: ExecutionEngineException

private ADODB.Connection _database;
private IntPtr _ptr = IntPtr.Zero;

public uint DataBase{
    get{
        return (uint)_ptr;
    }
    set{
        if( value != 0 ){
            _ptr = (IntPtr)value;
            GCHandle gH = GCHandle.FromIntPtr(_ptr); // THIS LINE THROW THE EXCEPTION
            _database = gH.Target;
        }
    }
}

نعم:لقد قمت بتغيير الكود الخاص بي لاستخدامه STRING

WinCC

extern __object* autoDB;
DWORD addr = (DWORD)autoDB;
char sAddr[11];
sprintf( sAddr, "%d\0", addr );
SetPropChar( "PictureName", "ControlName", "DataBaseAddr", sAddr );

وC# هو الآن

private string _lpszDataBaseAddr = "";
public string DataBaseAddr{
    get{
        return _lpszDataBaseAddr;
    }
    set{
        uint addr;
        bool ret = uint.TryParse( value, out addr );
        if( ! ret ){
            return;
        }
        IntPtr ptr = (IntPtr)addr;
        GCHandle gH = GCHandle.FromIntPtr( ptr );  // THE SAME ERROR!
    }
}

نتائج أخرى!

العنوان من ADO-Object غير موجود في ذاكرة العملية الذي استدعى عنصر التحكم الخاص بي (تصحيح الأخطاء باستخدام ollydbg).لدى WinCC برنامجين:PDLRT.exe للتصور (هذا يستدعي عنصر التحكم الخاص بي) وSCRIPT.exe لتشغيل GLOBAL-SCRIPT (Ansi-C).

من PDLRT، يمكنني الوصول إلى عنوان المؤشر من ADO-Object.عن طريق استدعاء GChandle في C# لعنوان كائن ADO، يتم طرح الاستثناء.(ExecutionEngineException)

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

المحلول 2

نعم،

منذ وقت طويل وأنا أطلب الدعم من Siemens.

سيمنز:يتم تحميل ملفات Dll وعناصر التحكم وما إلى ذلك المحملة في ذاكرة منفصلة وليس في ذاكرة التطبيق (الرئيسية).مشاركة عنوان الذاكرة بين Dlls وعناصر التحكم ....لا يعمل.جميعها لها ذاكرة منفصلة.

ممتاز.الطريقة الوحيدة:الأنابيب أو تطبيقات الاتصالات الأخرى (TCP/IP، ...).

نصائح أخرى

ليس لدي أي فكرة عما إذا كان بإمكان C# الوصول من خلال مؤشر إلى C++ بهذه الطريقة.

بغض النظر عن هذا: (DWORD)(&autoDB) هو الخطأ، الذي يضع عنوان المؤشر كقيمة العقار، وهو أمر لا معنى له.

أنت بحاجة إلى قيمة المؤشر، أي. (DWORD) autoDB.

أيضًا، SetPropDouble() يقبل قيمة النوع double, ، أي.رقم الفاصلة العائمة.لن تكون هذه طريقة لطيفة جدًا لمشاركة المؤشر، وهو عدد صحيح (كبير).جرب بعض التمثيلات المختلفة، قد تعمل السلسلة إذا لم يكن لديك إمكانية الوصول إلى عدد صحيح كبير بما فيه الكفاية.

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