كيف يمكن تمرير سلسلة مرة أخرى إلى labview باستخدام عقدة وظيفة مكتبة الاتصال

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

  •  06-07-2019
  •  | 
  •  

سؤال

أرغب في استخدام عقدة وظيفة مكتبة الاتصال الخاصة بـ LabVIEW للوصول إلى وظيفة DLL، وجعل هذه الوظيفة ترجع سلسلة لعرضها على جهاز VI الخاص بي.كيف لي أن تذهب عن القيام بذلك؟أنا سعيد جدًا بإرجاع الأرقام من مكتبة الارتباط الحيوي (DLL) الخاصة بي، ولكني أجد صعوبة في العثور على أي أمثلة حول كيفية إرجاع سلسلة.

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

المحلول

وافترض من سؤالك أن لديك بالفعل DLL التي يمكن أن تعود أرقام لابفيف. لإرجاع سلسلة من DLL، لقد خلق DLL مع الدالة التالية C ++

void returnString(char myString[])
{
  const char *aString = "test string";
  memcpy(myString, aString, 12);
}

في ابفيف I ثم استخدام مكتبة استدعاء دالة عقدة وتكوينه على النحو التالي

    Library Name or Path: c:\path\to\my\custom.dll
           Function Name: returnString
           Calling Convention: C

    Parameters: 
           Parameter: return type
                type: void

           Parameter: arg1
                type: String
                string format: C String Pointer

    Function prototype:
        void returnString(CStr arg1);

وبعد ربط مخرجات ARG1 في المخطط الصندوقي لمؤشر سلسلة والتشغيل. يجب أن تظهر السلسلة "سلسلة اختبار" في اللوحة الأمامية.

وحاولت الحصول على وظيفة returnString تكون من نوع كستر كما في

CStr returnString()
{ ...
 }

ولكن حصلت أخطاء بناء عند ترجمة مشروع DLL.

تحديث

وبفضل @ bk1e تعليق لا ننسى ما قبل تخصيص مساحة في ابفيف للسلسلة.

نصائح أخرى

هناك عدة طرق على الأقل لإرجاع سلسلة من عقدة وظيفة مكتبة الاتصال:

  1. قم بإرجاع مؤشر سلسلة C من وظيفة DLL الخاصة بك، وقم بتكوين عقدة وظيفة مكتبة الاتصال للحصول على نوع إرجاع "مؤشر سلسلة C".لاحظ أن السلسلة التي تم إرجاعها يجب أن تكون صالحة بعد إرجاع الدالة، لذلك لا يمكن أن تكون مؤشرًا لسلسلة مخصصة على المكدس.يجب أن يكون واحدًا مما يلي:المخصصة على الكومة، المخصصة بشكل ثابت، سلسلة حرفية ثابتة، إلخ.

    يبدو الأمر كذلك examples/dll/regexpr/Regular Expression Solution/VIs/Get Error String.vi في دليل LabVIEW يأخذ هذا النهج.

  2. قم بتخصيص سلسلة في VI الخاص بك، وقم بتمريرها إلى عقدة وظيفة مكتبة الاتصال باستخدام معلمة "C String Pointer" كما اقترح Azim، ثم قم باستبدال محتوياتها في ملف DLL.إحدى الطرق لتخصيص السلسلة هي استخدام تهيئة المصفوفة لإنشاء مصفوفة u8 بالحجم المطلوب، ثم استخدام Byte Array To String لتحويلها إلى سلسلة.

    تأكد من أن السلسلة التي تقوم بتمريرها كبيرة بما يكفي لاستيعاب محتويات السلسلة، وتأكد من تمرير طول السلسلة إلى مكتبة الارتباط الحيوي (DLL) حتى تعرف حجم المخزن المؤقت.أعتقد أن المعلمة الافتراضية هي سلسلة فارغة.قد يتطلب معرفة طول السلسلة الصحيح الاتصال بمكتبة الارتباط الحيوي (DLL) مرتين، إذا لم يكن التخمين الأول لـ VI الخاص بك كبيرًا بدرجة كافية.

  3. قم بتمرير السلسلة إلى عقدة وظيفة مكتبة الاتصال باستخدام معلمة "مقبض السلسلة"، واستخدم وظائف LabVIEW في مكتبة الارتباط الحيوي (DLL) لتغيير حجم السلسلة حسب الضرورة.يتطلب هذا أن يكون ملف DLL الخاص بك مصممًا خصيصًا للتفاعل مع LabVIEW ويتطلب الارتباط بمكتبة ثابتة يتم توفيرها مع LabVIEW.

    مثال على هذه الطريقة يأتي مع LabVIEW as examples/dll/hostname/hostname.vi.

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