Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
898
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
950
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
940
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1725
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4398
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Указатель на указатель управляемый C++
У меня есть старая библиотека C с функцией, которая принимает void**:
oldFunction(void** pStuff);
Я пытаюсь вызвать эту функцию из managed C++ (m_pStuff является членом родительского ref-класса типа void*):
oldFunction( static_cast<sqlite3**>( &m_pStuff ) );
Это дает мне следующую ошибку от Visual Studio:
ошибка C2440: 'static_cast': не удается преобразовать из 'cli::interior_ptr' в ' void **'
Я предполагаю, что компилятор преобразует указатель члена void* в cli::interior_ptr за моей спиной.
Есть какие-нибудь советы, как это сделать?
EDIT: исправлен ответ, см. ниже.
На самом деле вам нужно знать, что 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. Затем я копирую результат (вероятно, обновленный oldFunction) обратно в управляемый объект. Поскольку управляемый объект находится в управляемой куче, компилятор не позволит вам передать ссылку на указатель, содержащийся в этом объекте, поскольку он может перемещаться при запуске сборщика мусора.
Спасибо за совет, указатель находится на абстрактную структуру стиля C, которая, как я думаю, если я оставлю эту структуру открытой для управляемого кода, вызовет дополнительную боль из-за отсутствия определенной структуры. Поэтому я думаю, что сделаю следующее: оберну библиотеку C в C++ , а затем оберну оболочку C++ с управляемым C++, что предотвратит раскрытие этих структур C управляемому коду.