3 / 2 / 2
Регистрация: 21.03.2017
Сообщений: 297
1

Как передать SAFEARRAY в C#?

05.03.2018, 06:54. Показов 3815. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть такой метод в C++ библиотеке (метод не мой, почему написан именно так не знаю):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//CEncrypt
STDMETHODIMP CEncrypt::RC4Encrypt(char *data, const char *password, SAFEARRAY **result)
{
    RELEASE_TRY
    {
        size_t sz = strlen(data);
        RC4_Session rec;
 
        rec.data = data;
        rec.data_len = sz;
 
        RC4_Start(rec, password, strlen(password));
 
        CComSafeArray<BYTE, VT_UI1> resArray;
        for (size_t i = 0; i<sz; i++)
        {
            data[i] ^= RC4_Gen(rec);
            resArray.Add(sizeof(BYTE), (BYTE*)&data[i], false);
        }
        *result = resArray.Detach();
    }
    RELEASE_CATCH_ALL;
    return S_OK;
}
Его нужно вызвать в коде c#. Просмотрел массу вариантов, как это можно сделать - не сработал ни один. В настоящее время делаю это так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[DllImport("DAEncryption32.dll", EntryPoint = "testEnc2", CallingConvention = CallingConvention.Cdecl)]
     public static extern string EncryptUTF8(
           IntPtr encKey, 
           IntPtr dataB,
           [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)] out dynamic ManagedStringArray);
 
    public string Encode(string dataB)
    {
            string resmeth = "";
            dynamic result = "";
            var param1 = Marshal.StringToBSTR(dataB);
            var param2 = Marshal.StringToBSTR(encKey);
            resmeth = EncryptUTF8(param1, param2, out result);
            
            return resmeth;
     }
Получаю вот такую ошибку:
System.Runtime.InteropServices.MarshalDirectiveException: 'Cannot marshal 'parameter #3': Invalid managed/unmanaged type combination (the Object class must be paired with Interface, IUnknown, IDispatch, AsAny, or Struct).'

Что не так делаю? как сделать правильно?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.03.2018, 06:54
Ответы с готовыми решениями:

Получить указатель на данные, хранящиеся в SafeArray (не на сам SafeArray)
Есть некий SafeArray, о котором заранее известно, что это одномерный массив байт. То есть структура его проста и неизменна. Надеюсь, это...

Как сделать SafeArray (MFC)?
Сабж, как используя MFC создать SafeArray и сделать метод который принимая их контейнера массив вариантов и пихал его в SafeArray (размеры...

Как при пользовании COM - объектов работать с типом обявленым как SafeArray?
Как при пользовании COM - объектов работать с типом обявленым как SafeArray?

3
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,890
05.03.2018, 12:14 2
Цитата Сообщение от Abejon Посмотреть сообщение
Cannot marshal 'parameter #3
на стороне C++ вы объявляете массив из unsigned char (VT_UI1):
Цитата Сообщение от Abejon Посмотреть сообщение
CComSafeArray<BYTE, VT_UI1> resArray;
а на стороне C# вы этот аргумент объявляете как массив строк (VT_BSTR):
Цитата Сообщение от Abejon Посмотреть сообщение
[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_BSTR)]
Цитата Сообщение от Abejon Посмотреть сообщение
Что не так делаю? как сделать правильно?
Но правильно имхо это взять уже готовую реализацию RC4 для C#.
0
3 / 2 / 2
Регистрация: 21.03.2017
Сообщений: 297
05.03.2018, 12:30  [ТС] 3
Но правильно имхо это взять уже готовую реализацию RC4 для C#.
Да, это было бы правильно, но в данный момент это невозможно. Стандартный алгоритм не совместим с дешифрованием в клиентском приложении, которое использует такой же алгоритм, оно установлено на многих десятках тысяч компьютеров. Эти компьютеры разбросаны по тысячам филиалов, и все их придётся менять вручную, т.к. автоапдейт в клиенте не реализован.
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,890
05.03.2018, 12:36 4
Abejon, на C# стороне 3й аргумент нужно объявлять как-то так:
C#
1
[Out, MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UI1)] out byte[] result
C++ - Simplify Safe Array Programming in C++ with CComSafeArray / Producing a Safe Array of Bytes
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.03.2018, 12:36
Помогаю со студенческими работами здесь

Bad SAFEARRAY
Создаю функцию которая получает данные из объекта типа _variant_t, мне нужно получить из него 2 значения типа double. Я плохо знаю...

Transpose SafeArray
Всем привет. Набросал функцию для транспонирования SafeArray (двухмерный), с любым типом данных. Вопрос знатокам: можно ли сделать...

Уничтожение SafeArray в Delphi XE
Всем привет. Я перешел с Delphi 7 на Delphi XE4. В седьмой версии при создании элементов типа PSafeArray необходимо было самому следить за...

COM: SAFEARRAY добавление элементов
День добрый. Перерыл множество ресурсов в поисках ответа на мой вопрос, но всё тщетно. Существует функция, в ней 4 типа данных: int,...

Массив представить в виде SAFEARRAY
Вот такой массив $tak = array(0,0,1,0,1,0,0,0,1,1); Научите, пожалуйста, как представить это в виде SAFEARRAY (VT_ARRAY|VT_R8). ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Java Micronaut в Docker: контейнеризация с Maven и Jib
Javaican 16.03.2025
Когда речь заходит о микросервисной архитектуре на Java, фреймворк Micronaut выделяется среди конкурентов. Он создан с учётом особенностей облачных сред и контейнеров, что делает его идеальным. . .
Управление зависимостями в Java: Сравнение Spring, Guice и Dagger 2
Javaican 16.03.2025
Инъекция зависимостей (Dependency Injection, DI) — один из фундаментальных паттернов проектирования, который радикально меняет подход к созданию гибких и тестируемых Java-приложений. Суть этого. . .
Apache Airflow для оркестрации и автоматизации рабочих процессов
Mr. Docker 16.03.2025
Управление сложными рабочими процессами — одна из главных головных болей инженеров данных и DevOps-специалистов. Представьте себе: каждый день нужно запускать десятки скриптов в определенной. . .
Оптимизация приложений Java для ARM
Javaican 16.03.2025
ARM-архитектура переживает настоящий бум популярности в технологическом мире. Когда-то воспринимаемая исключительно как решение для мобильных устройств и встраиваемых систем, сегодня она штурмует. . .
Управление состоянием в Vue 3 с Pinia и Composition API
Reangularity 16.03.2025
Когда я начал работать с Vue несколько лет назад, мне казалось достаточным использовать простую передачу данных через props и события между компонентами. Однако уже на среднем по сложности проекте. . .
Введение в DevSecOps: основные принципы и инструменты
Mr. Docker 16.03.2025
DevSecOps - это подход к разработке программного обеспечения, который объединяет в себе принципы разработки (Dev), безопасности (Sec) и эксплуатации (Ops). Суть подхода заключается в том, чтобы. . .
GitHub Actions vs Jenkins: Сравнение инструментов CI/CD
Mr. Docker 16.03.2025
В этой битве за эффективность и скорость выпуска программных продуктов ключевую роль играют специализированные инструменты. Два гиганта в этой области — GitHub Actions и Jenkins — предлагают разные. . .
Реактивное программировани­е с Kafka Stream и Spring WebFlux
Javaican 16.03.2025
Реактивное программирование – это программная парадигма, ориентированная на потоки данных и распространение изменений. Она позволяет выражать статические или динамические потоки данных и. . .
Простая нейросеть на КуМир: Учебное пособие по созданию и обучению нейронных сетей
EggHead 16.03.2025
Искусственные нейронные сети — удивительная технология, позволяющая компьютерам имитировать работу человеческого мозга. Если вы хотя бы немного интересуетесь современными технологиями, то наверняка. . .
Исполнитель Кузнечик в КуМир: Решение задач
EggHead 16.03.2025
Среди множества исполнителей в системе КуМир особое место занимает Кузнечик — простой, но невероятно полезный виртуальный персонаж, который перемещается по числовой прямой, выполняя ваши команды. На. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru