Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 07.07.2012
Сообщений: 21

Как обработать возвращаемое значение из библиотеки на C++

14.09.2012, 13:00. Показов 1602. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется DLL библиотека на С++ с вот такой экспортируемой функцией
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
wstring* GetDevicesesNames()
{
    wstring *names = new wstring[countDeviceses]; 
    for (UINT32 i = 0; i < countDeviceses; i++)
    {
        WCHAR *szFriendlyName = NULL;
        ppDevices[i]->GetAllocatedString(
            MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, 
            &szFriendlyName, 
            NULL
            );
 
        names[i] = wstring(szFriendlyName);
        CoTaskMemFree(szFriendlyName);
    }
    return names;
}
Как мне на C# обработать возвращаемое значение?
Что означает этот ^ символ в шарпе?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.09.2012, 13:00
Ответы с готовыми решениями:

Как обработать исключение из чужой библиотеки?
Вопрос возможно глупый, не могу найти решение, в инете описаны примеры когда ты сам написал функцию и отлавливаешь ее исключения. А что...

Массив как возвращаемое функцией значение
Подскажите пожалуйста пример функции, которая возвращает массив, спасибо))

Как правильно проверить возвращаемое значение?
Здравствуйте! метод public function checkAuth() { if (isset($_SESSION)) { $auth = $this-&gt;pdo('select * from users...

9
 Аватар для SaweR
29 / 29 / 4
Регистрация: 29.09.2009
Сообщений: 177
14.09.2012, 13:34
Цитата Сообщение от Ramirag Посмотреть сообщение
^ символ
означает управляемый обьект в managed c++

Добавлено через 41 секунду
Цитата Сообщение от Ramirag Посмотреть сообщение
^ символ в шарпе
не нужен
0
0 / 0 / 0
Регистрация: 07.07.2012
Сообщений: 21
14.09.2012, 20:11  [ТС]
Неужели в шарпе никак нельзя обработать указатель на массив строк? Я тут пробовал через Marshal, но там можно максимум толькопервый элемент, да и он не совсем верно, тк одни кракозябры на выходе)
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
14.09.2012, 20:46
Цитата Сообщение от Ramirag Посмотреть сообщение
Что означает этот ^ символ в шарпе?
http://msdn.microsoft.com/ru-r... cc7k1.aspx
0
0 / 0 / 0
Регистрация: 07.07.2012
Сообщений: 21
14.09.2012, 20:48  [ТС]
Про то что это тип операции я знаю. Меня вот смутила запись вида String ^ str. Про это выше писали
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8728 / 3680 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
14.09.2012, 21:09
Цитата Сообщение от Ramirag Посмотреть сообщение
Неужели в шарпе никак нельзя обработать указатель на массив строк?
Можно, только wstring это не строка в чистом (C-style) виде, а класс со своей внутренней реализацией, поэтому максимум что можно получить это адрес объекта wstring в памяти (не путать с адресом по которому расположена строка). Чтобы в шарпе можно было обрабатывать строки из C/C++/etc. (native dll в общем) они (строки) должны быть приведены к C-style виду, либо обрабатывать строки самому, если известен формат (способ) их хранения в памяти.
0
0 / 0 / 0
Регистрация: 07.07.2012
Сообщений: 21
17.09.2012, 17:18  [ТС]
Ответ мне был дан на форуме MSDN, кому надо читайте.

Цитата Сообщение от Question
I have a DLL function

C++
1
2
3
4
5
6
7
8
9
10
11
WCHAR** GetDevicesesNames()
{
    WCHAR **names = new WCHAR*[CountDevices]; 
    for (UINT32 i = 0; i < CountDevices; i++)
        ppDevices[0]->GetAllocatedString(
            MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, 
            &names[i], 
            NULL
            );
    return names;
}
How to work with return value in C#
Цитата Сообщение от Answer
Hello Ramirag,

1. The return value should be declared as an IntPtr.

2. The GetDevicesesNames() API may be declared in C# as :

C#
1
2
[DllImport("RamiragDLL.dll", CallingConvention=CallingConvention.StdCall)]
public static extern IntPtr GetDevicesesNames();
3. Hence the "names" array of WCHAR pointers will be received as an IntPtr in C#.

4. This IntPtr by itself cannot be converted directly into an array of managed strings. Each WCHAR pointer inside "names" must be converted one by one to a managed string. Thereafter, each WCHAR pointer must be freed. And after that, the "names" array itself must be freed.
5. Furthermore, in the C++ code, the array of WCHAR pointers that "names" points to must not be allocated via the C++ new operator. It must be allocated using either CoTaskMemAlloc() or LocalAlloc().

6. This is because the "names" array is returned to the caller (C# code) and so it is "owned" by the client code. Being the owner of the returned array, the onus is on this client code to free the memory of this array (as mentioned in point 4).

7. C# code can only free unmanaged memory using either :

7.1 Marshal.FreeCoTaskMem() (which calls CoTaskMemFree(), the conjugal of CoTaskMemAlloc()).

7.2 Or Marshal.FreeHGlobal() (which calls LocalFree(), the conjugal of LocalAlloc()).

8. The C# code below demonstrate the points mentioned above :

C#
1
2
3
4
5
6
7
8
static void DoTest()
{
    IntPtr ppStr = GetDevicesesNames();
    
    string [] ManagedStrArray;
 
    MarshalUnmananagedStrArray2ManagedStrArray(ppStr, 4, out ManagedStrArray);
}
8.1 The code above calls GetDevicesesNames() to receive "names" as an IntPtr.

8.2 Thereafter, MarshalUnmananagedStrArray2ManagedStrArr ay() (code provided below) is called to convert "names" into a managed array of strings and also to free the unmanaged strings inside "names" and also to free the "names" array itself.

9. The following is the code for MarshalUnmananagedStrArray2ManagedStrArr ay() :

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
25
26
27
28
29
30
31
32
33
34
35
36
37
// This method transforms an array of unmanaged character pointers (pointed to by pUnmanagedStringArray)
// into an array of managed strings.
//
// This method also destroys each unmanaged character pointers and will also destroy the array itself.
static void MarshalUnmananagedStrArray2ManagedStrArray
(
  IntPtr pUnmanagedStringArray, // Pointer to an array of unmanaged WCHAR pointers.
  int StringCount,  // The total number of WCHAR*s in pUnmanagedStringArray.
  out string[] ManagedStringArray  // Receipient of the array of managed strings.
)
{
    // First allocate an array of IntPtrs.
    IntPtr[] pIntPtrArray = new IntPtr[StringCount];
    // Also allocate an array of managed strings using
    // the ManagedStringArray parameter.
    ManagedStringArray = new string[StringCount];
 
    // Copy the WCHAR*s from pUnmanagedStringArray to 
    // the array of IntPtrs (pIntPtrArray).
    Marshal.Copy(pUnmanagedStringArray, pIntPtrArray, 0, StringCount);
 
    // Then, one by one, convert each of the WCHAR*s 
    // inside the pIntPtrArray array into a managed string.
    // Simultaneously, clear away the WCHAR* using
    // Marshal.FreeCoTaskMem() - this is why we must use
    // CoTaskMemAlloc() and cannot use the C++ new nor
    // the C malloc().
    for (int i = 0; i < StringCount; i++)
    {
        ManagedStringArray[i] = Marshal.PtrToStringUni(pIntPtrArray[i]);
        Marshal.FreeCoTaskMem(pIntPtrArray[i]);
    }
    
    // Finally, free the entire buffer of unmanaged
    // WCHAR*s.
    Marshal.FreeCoTaskMem(pUnmanagedStringArray);
}
9.1 Please refer to the self-explanatory comments above for the working details of the function.

10. I have previously written an article that expounds on something similar. Please refer to :

Returning an Array of Strings from C++ to C# Part 1

(http://limbioliong.wordpress.c... -c-part-1/)

- Bio.
0
17.09.2012, 17:55

Не по теме:

Ramirag, вопросы как-бы разные... Ответ Вам дали и тут.

0
0 / 0 / 0
Регистрация: 07.07.2012
Сообщений: 21
17.09.2012, 17:58  [ТС]
То-же самое, отличие только в том, что на том форуме я передаю двумерный массив wchart,а не массив wstring
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8728 / 3680 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
17.09.2012, 18:02
Цитата Сообщение от Ramirag Посмотреть сообщение
двумерный массив wchart,а не массив wstring
Это не одно и тоже.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.09.2012, 18:02
Помогаю со студенческими работами здесь

Как присвоить значение возвращаемое функцией?
#include &lt;iostream.h&gt; char* abc(int num){ static char masiv; masiv = num+'0'; return masiv; } main(){ char...

Как проанализировать значение возвращаемое функцией ShellExecute?
Всем здравствуйте. Инструкция int res = ShellExecute(0, L&quot;open&quot;, path.c_str(), NULL, 0, SW_SHOWNORMAL); вызывает ошибку на...

Как присвоить возвращаемое значение функции переменной?
double sine(int index, int frequency) { return (100*sin(index*frequency)); } вопрос: как присвоить возвращаемое значение...

Как в перл скрипте прочитать возвращаемое значение?
У меня в форме используются radiobutton, как в перл скрипте прочитать возвращаемое значение? И еще как с помощью перл отправить письмо с...

Как получить значение, возвращаемое методом без параметров
Вообщем, делаю так: static string ffff() { try { return &quot;&quot;; ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru