سؤال

لدي مكتبة C قديمة بها وظيفة تأخذ فراغًا **:

oldFunction(void** pStuff);

أحاول استدعاء هذه الوظيفة من C++ المُدارة (m_pStuff عضو في فئة المرجع الأصل من النوع void*):

oldFunction( static_cast<sqlite3**>(  &m_pStuff ) );

هذا يعطيني الخطأ التالي من Visual Studio:

خطأ C2440:'static_cast' :لا يمكن التحويل من 'cli::interior_ptr' إلى 'void **'

أعتقد أن المترجم يقوم بتحويل مؤشر العضو void* إلى cli::interior_ptr خلف ظهري.

أي نصيحة حول كيفية القيام بذلك؟

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

المحلول

يحرر:الإجابة الثابتة، انظر أدناه.

أنت حقًا بحاجة إلى معرفة ما الذي ستفعله oldFunction مع pStuff.إذا كان pStuff مؤشرًا لبعض البيانات غير المُدارة، فيمكنك محاولة تغليف تعريف m_pStuff باستخدام:

#pragma unmanaged

void* m_pStuff

#pragma managed

سيؤدي هذا إلى جعل المؤشر غير مُدار ويمكن بعد ذلك تمريره إلى وظائف غير مُدارة.بالطبع لن تتمكن من تعيين أي كائنات مُدارة لهذا المؤشر مباشرةً.

المؤشرات المُدارة وغير المُدارة بشكل أساسي ليست هي نفسها ولا يمكن تحويلها بدون نوع من التعليمات البرمجية اللاصقة التي تنسخ البيانات الأساسية.تشير المؤشرات المُدارة بشكل أساسي إلى الكومة المُدارة وبما أن هذه عبارة عن مجموعة من البيانات المهملة، فإن عنوان الذاكرة الفعلي الذي تشير إليه يمكن أن يتغير بمرور الوقت.لا تقوم المؤشرات غير المُدارة بتغيير عنوان الذاكرة دون أن تقوم بذلك بشكل صريح.

اخدش ذلك، لا يمكنك تحديد غير مُدار/مُدار داخل تعريف الفئة.ولكن يبدو أن رمز الاختبار هذا يعمل بشكل جيد:

// TestSol.cpp : main project file.

#include "stdafx.h"

using namespace System;

#pragma unmanaged

void oldFunction(void** pStuff)
{
    return;
}

#pragma managed

ref class Test
{
public:
    void* m_test;

};

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Hello World");

    Test^ test = gcnew Test();
    void* pStuff = test->m_test;
    oldFunction(&pStuff);
    test->m_test = pStuff;

    return 0;
}

هنا أقوم بنسخ المؤشر من الكائن المُدار أولاً ثم قم بتمريره إلى الوظيفة القديمة.ثم أنسخ النتيجة (ربما تم تحديثها بواسطة oldFunction) مرة أخرى إلى الكائن المُدار.نظرًا لأن الكائن المُدار موجود في الكومة المُدارة، فلن يسمح لك المترجم بتمرير مرجع إلى المؤشر الموجود في هذا الكائن لأنه قد يتحرك عند تشغيل أداة تجميع البيانات المهملة.

نصائح أخرى

شكرًا على النصيحة، المؤشر يشير إلى بنية مجردة على طراز C والتي أعتقد أنها إذا تركت هذه البنية مكشوفة للتعليمات البرمجية المُدارة فسوف تسبب المزيد من الألم بسبب افتقارها إلى بنية محددة.لذا فإن ما أعتقد أنني سأفعله هو تغليف مكتبة C في C++ ثم تغليف غلاف C++ باستخدام C++ المُدار، مما سيمنع تعريض بنيات C هذه للتعليمات البرمجية المُدارة.

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