Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# .NET

Войти
Регистрация
Восстановить пароль
 
 
navab
1 / 1 / 0
Регистрация: 26.07.2012
Сообщений: 133
#1

Маршалинг string - C#

11.09.2015, 15:42. Просмотров 802. Ответов 15

Возник затуп при обращении к dll на с++.

Как связан .net'овский string и CHAR,WCHAR,LPSTR,LPCSTR,LPWSTR,LPCWSTR? Как будет маршалинг происходить?

Я так понимаю, string - это всегда юникод, каждый символ - 2 байта. Т.е. входной параметр с++ функции должен быть объявлен как *WCHAR или LPWSTR? А если он объявлен, например, как CHAR*, что будет происходить? И важно ли при этом, включена или нет поддержка юникода в проекте c++ при компиляции?

Несколько сумбурно, но суть, надеюсь, ясна)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2015, 15:42
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Маршалинг string (C#):

Маршалинг структур. Размер string - C#
В общем начал разбираться с маршалингом структур. правда некоторые моменты непонятны. например Вот я делаю так public...

Маршалинг структуры C# --> C - C#
В неуправляемом коде (bla.dll) есть структура: typedef struct { ULONG32 a; UINT8 b; UINT8 c; UINT16 d; ...

.NET 4.x Маршалинг и структура - C#
Добрый день, товарищи. Есть библиотека С++, в которой имеется структура и метод с нею работающий: struct MyCPPStruct { char...

Маршалинг C++ wchar_t** в C# - C#
Доброго времени суток! Столкнулся со следующей задачей. Есть библиотека, в библиотеке есть функция, которую необходимо вызвать в C#...

Маршалинг данных - C#
Необходимо передавать массивы данных из управляемого кода в неуправляемый. Почитал про атрибуты , но я понял так, что независимо от...

Что такое маршалинг? - C#
Можете по простому объяснить что это такое. И пример, где это используется и для чего он нужен.

15
Psilon
Master of Orion
Эксперт .NET
5932 / 4831 / 636
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
19.09.2015, 00:00 #16
navab, недопустим хотя бы потому, что мы не можем контролировать размер буфера, который таскаем туда-сюда. Если нужно менять размер строки, то тогда нужно юзать IntPtr в качестве значения (Это местный (void*) и уже его вручную маршаллить в строку с помощью класса Marshal собственно.

Добавлено через 4 минуты
Полная цитатка:
You cannot use StringBuilder, it has to be passed without ref and is intended to allow the callee to copy the string contents in the buffer. You need an extra argument, bufferLength, that ensures that the native code cannot destroy the GC heap. Pass the Capacity value. Use wcscpy_s() to copy the string content.

But you are returning a pointer. That doesn't make the pinvoke marshaller very happy, it is a troublesome memory management issue. It assumes that somebody has to clean up the string buffer. When you let the marshaller do it then it will call CoTaskMemFree(), that rarely comes to a good end.

You'll have to fool it and declare the argument as ref IntPtr instead. Then use Marshal.PtrToStringUni() in your C# code to retrieve the string. Otherwise a nasty failure mode if you don't return a pointer to a string literal but allocate on the heap or dangle a wchar[] pointer. Copying is the safe way.
Автор
0
19.09.2015, 00:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2015, 00:00
Привет! Вот еще темы с ответами:

Маршалинг Waveform Audio - C#
Привет. Возникла необходимость сделать wrapper для c# библиотеки Windows Waveform Audio. Пока работаю пока только с одной структурой...

Маршалинг структур: динамическое управление размером - C#
Решил изучить как с помощью средств c# передавать структуры. Нашел способы преобразования структур в массив байт с помощью Marashal. Вот...

Маршалинг структуры указателей широких строк в C# приложение - C#
Dll: #include "stdafx.h" #include "windows.h" struct MyStruct { public: LPWSTR str1;

List<string, string, string> есть ли в C# что-то подобное - C#
Мне надо добавить в List не только имя файла, но и некоторые строки из этого файла. Т.е. например, у меня есть в определенном директории...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru