powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / StringBuilder и терминатор
18 сообщений из 18, страница 1 из 1
StringBuilder и терминатор
    #38150014
FullKettle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вызываю функцию из DLL(С++), на выходе параметр unsigned char* который в C# поступает как StringBulder. В середине параметра (строки) встречаются терминаторы, соответственно StringBulder на первом из них обрезается. Далее этот параметр надо передавать опять в DLL, а он передается только обрезанным. Как исправить?
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38150117
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FullKettle,

покажи пример. Строки в .NET могут работать с нулем внутри. Даже если их несколько подряд идет.
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38185735
FullKettle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileFullKettle,

покажи пример. Строки в .NET могут работать с нулем внутри. Даже если их несколько подряд идет.
Мочь то могут, но она уже на выходе из функции обрезается по самый терминатор.
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38185762
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FullKettle, из какой функции? Из C++ DLL или C# кода? Если первое, то или функция плохо работает со строками с 0-terminator или ты не так вызываешь эту функцию. Приведи пример для вопроизведения.
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38185793
FullKettle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileFullKettle, из какой функции? Из C++ DLL или C# кода? Если первое, то или функция плохо работает со строками с 0-terminator или ты не так вызываешь эту функцию. Приведи пример для вопроизведения.
Код: c#
1.
[DllImport("d12.dll")] public static extern int ReadDev(int addr, StringBuilder buff);


Код: c#
1.
2.
StringBuilder b = new StringBuilder();
state = ReadDev(1, b);



Библиотека на VC++, параметр buff в ней объявлен как unsigned char*
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38185824
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FullKettle,

автор[DllImport("d12.dll")] public static extern int ReadDev(int addr, string buff);

а если так?
у СтрингБилдера не так много входных параметров
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38185825
FullKettle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FullKettlebazileFullKettle, из какой функции? Из C++ DLL или C# кода? Если первое, то или функция плохо работает со строками с 0-terminator или ты не так вызываешь эту функцию. Приведи пример для вопроизведения.
Код: c#
1.
[DllImport("d12.dll")] public static extern int ReadDev(int addr, StringBuilder buff);


Код: c#
1.
2.
StringBuilder b = new StringBuilder();
state = ReadDev(1, b);



Библиотека на VC++, параметр buff в ней объявлен как unsigned char*
Соответственно DLL возвращает строку длиной скажем 20 с терминатором по центру, в в StringBuilder строка длиной по терминатор
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38185830
FullKettle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-erFullKettle,

автор[DllImport("d12.dll")] public static extern int ReadDev(int addr, string buff);

а если так?
у СтрингБилдера не так много входных параметров
Так вообще пустую строку возвращает
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38185838
FullKettle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FullKettlebeg-in-erFullKettle,

пропущено...


а если так?
у СтрингБилдера не так много входных параметров
Так вообще пустую строку возвращает
Если с параметрами out или ref, то System.ExecutionEngineException
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38185854
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FullKettle,

ну попробуйте дайте то что он хочет
[DllImport("d12.dll")] public static extern int ReadDev(int addr, char[] buff);

а параметр addr это не длинна строки?
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38185856
FullKettle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-erFullKettle,

ну попробуйте дайте то что он хочет
[DllImport("d12.dll")] public static extern int ReadDev(int addr, char[] buff);

а параметр addr это не длинна строки?
нет, не длина. Но длина фиксированная и я ее знаю. Провобовал как byte[] - Exception
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38185857
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FullKettle,

в конце концов это должно работать. если addr это длина.
автор[DllImport("d12.dll")] public static extern int ReadDev(int addr, char* buff);
[DllImport("d12.dll")] public static extern int ReadDev(int addr, ushort* buff);
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38185859
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FullKettle,

ну если длина фикс , ловите через указатель. и там выковыривайе в строку.
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38185860
FullKettle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-erFullKettle,

ну попробуйте дайте то что он хочет
[DllImport("d12.dll")] public static extern int ReadDev(int addr, char[] buff);

а параметр addr это не длинна строки?
Тоже самое что и с String.
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38185865
FullKettle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-erFullKettle,

ну если длина фикс , ловите через указатель. и там выковыривайе в строку.
Использование в небезопасном контексте?
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38185874
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FullKettle,

да. разумеется.
этот небезопасный контекст придуман незнамо для чего. т.к. в CLR упоминание о нём оттсвует . метот помеченый как unsafe выглядит точно так же , как не помеченный.
Код: c#
1.
2.
3.
4.
unsafe void Method()
{
 ReadDev(....
}
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38185878
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FullKettle, проблема не в StringBuilder, в правилах по умолчанию для маршаллинга строк. .NET предполагает, что строка заканчивается нулевым символом и останавливается на нем. Тебе нужно написать код для обработки таких строк. Смотри пример в обсуждении Работа с GetEnvironmentStrings: как получить список переменных окружения и статью Advanced Topics in PInvoke String Marshaling .
...
Рейтинг: 0 / 0
StringBuilder и терминатор
    #38188299
FullKettle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал разные варианты. Ни один не выдает требуемого результата.
Случайно вернулся на тот вариант, который ранее пробовал..через byte[]. Заработало. Не понятно ничего, то не работало, то заработало.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / StringBuilder и терминатор
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]