Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
13.02.2013, 17:43
|
|||
---|---|---|---|
|
|||
StringBuilder и терминатор |
|||
#18+
Вызываю функцию из DLL(С++), на выходе параметр unsigned char* который в C# поступает как StringBulder. В середине параметра (строки) встречаются терминаторы, соответственно StringBulder на первом из них обрезается. Далее этот параметр надо передавать опять в DLL, а он передается только обрезанным. Как исправить? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.02.2013, 18:35
|
|||
---|---|---|---|
StringBuilder и терминатор |
|||
#18+
FullKettle, покажи пример. Строки в .NET могут работать с нулем внутри. Даже если их несколько подряд идет. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2013, 15:12
|
|||
---|---|---|---|
|
|||
StringBuilder и терминатор |
|||
#18+
bazileFullKettle, покажи пример. Строки в .NET могут работать с нулем внутри. Даже если их несколько подряд идет. Мочь то могут, но она уже на выходе из функции обрезается по самый терминатор. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2013, 15:27
|
|||
---|---|---|---|
StringBuilder и терминатор |
|||
#18+
FullKettle, из какой функции? Из C++ DLL или C# кода? Если первое, то или функция плохо работает со строками с 0-terminator или ты не так вызываешь эту функцию. Приведи пример для вопроизведения. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2013, 15:40
|
|||
---|---|---|---|
|
|||
StringBuilder и терминатор |
|||
#18+
bazileFullKettle, из какой функции? Из C++ DLL или C# кода? Если первое, то или функция плохо работает со строками с 0-terminator или ты не так вызываешь эту функцию. Приведи пример для вопроизведения. Код: c# 1.
Код: c# 1. 2.
Библиотека на VC++, параметр buff в ней объявлен как unsigned char* ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2013, 15:50
|
|||
---|---|---|---|
StringBuilder и терминатор |
|||
#18+
FullKettle, автор[DllImport("d12.dll")] public static extern int ReadDev(int addr, string buff); а если так? у СтрингБилдера не так много входных параметров ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2013, 15:51
|
|||
---|---|---|---|
|
|||
StringBuilder и терминатор |
|||
#18+
FullKettlebazileFullKettle, из какой функции? Из C++ DLL или C# кода? Если первое, то или функция плохо работает со строками с 0-terminator или ты не так вызываешь эту функцию. Приведи пример для вопроизведения. Код: c# 1.
Код: c# 1. 2.
Библиотека на VC++, параметр buff в ней объявлен как unsigned char* Соответственно DLL возвращает строку длиной скажем 20 с терминатором по центру, в в StringBuilder строка длиной по терминатор ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2013, 15:53
|
|||
---|---|---|---|
|
|||
StringBuilder и терминатор |
|||
#18+
beg-in-erFullKettle, автор[DllImport("d12.dll")] public static extern int ReadDev(int addr, string buff); а если так? у СтрингБилдера не так много входных параметров Так вообще пустую строку возвращает ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2013, 15:54
|
|||
---|---|---|---|
|
|||
StringBuilder и терминатор |
|||
#18+
FullKettlebeg-in-erFullKettle, пропущено... а если так? у СтрингБилдера не так много входных параметров Так вообще пустую строку возвращает Если с параметрами out или ref, то System.ExecutionEngineException ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2013, 15:59
|
|||
---|---|---|---|
StringBuilder и терминатор |
|||
#18+
FullKettle, ну попробуйте дайте то что он хочет [DllImport("d12.dll")] public static extern int ReadDev(int addr, char[] buff); а параметр addr это не длинна строки? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2013, 16:00
|
|||
---|---|---|---|
|
|||
StringBuilder и терминатор |
|||
#18+
beg-in-erFullKettle, ну попробуйте дайте то что он хочет [DllImport("d12.dll")] public static extern int ReadDev(int addr, char[] buff); а параметр addr это не длинна строки? нет, не длина. Но длина фиксированная и я ее знаю. Провобовал как byte[] - Exception ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2013, 16:00
|
|||
---|---|---|---|
StringBuilder и терминатор |
|||
#18+
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); ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2013, 16:01
|
|||
---|---|---|---|
StringBuilder и терминатор |
|||
#18+
FullKettle, ну если длина фикс , ловите через указатель. и там выковыривайе в строку. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2013, 16:02
|
|||
---|---|---|---|
|
|||
StringBuilder и терминатор |
|||
#18+
beg-in-erFullKettle, ну попробуйте дайте то что он хочет [DllImport("d12.dll")] public static extern int ReadDev(int addr, char[] buff); а параметр addr это не длинна строки? Тоже самое что и с String. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2013, 16:03
|
|||
---|---|---|---|
|
|||
StringBuilder и терминатор |
|||
#18+
beg-in-erFullKettle, ну если длина фикс , ловите через указатель. и там выковыривайе в строку. Использование в небезопасном контексте? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2013, 16:07
|
|||
---|---|---|---|
StringBuilder и терминатор |
|||
#18+
FullKettle, да. разумеется. этот небезопасный контекст придуман незнамо для чего. т.к. в CLR упоминание о нём оттсвует . метот помеченый как unsafe выглядит точно так же , как не помеченный. Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2013, 16:08
|
|||
---|---|---|---|
StringBuilder и терминатор |
|||
#18+
FullKettle, проблема не в StringBuilder, в правилах по умолчанию для маршаллинга строк. .NET предполагает, что строка заканчивается нулевым символом и останавливается на нем. Тебе нужно написать код для обработки таких строк. Смотри пример в обсуждении Работа с GetEnvironmentStrings: как получить список переменных окружения и статью Advanced Topics in PInvoke String Marshaling . ... |
|||
:
Нравится:
Не нравится:
|
|||
|
18.03.2013, 16:43
|
|||
---|---|---|---|
|
|||
StringBuilder и терминатор |
|||
#18+
Попробовал разные варианты. Ни один не выдает требуемого результата. Случайно вернулся на тот вариант, который ранее пробовал..через byte[]. Заработало. Не понятно ничего, то не работало, то заработало. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=20&tablet=1&tid=1405007]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 10ms |
total: | 171ms |
0 / 0 |