Что делать, если dll возвращает строку, некорректно завершенную - PullRequest
1 голос
/ 10 марта 2009

У меня есть третья часть DLL, в которой есть функция, которая возвращает строку. Когда я вызываю функцию, я получаю, например, «123456» обратно. По крайней мере, это выглядит так, но когда я делаю mystring.length, он не возвращает никакой длины. Если я устанавливаю свойство text метки, оно показывает «123456».

Когда у меня есть строка, которую я получил от dll, я отправляю ее в функцию веб-сервиса:

rem call dll and get string
dim mystring as string=mydll.getstring()

rem Send it to the webservice
webservice.SaveString(mystring) 

Веб-служба аварийно завершает работу с webexeption («ошибка protocoll»), когда я отправляю строку, полученную из библиотеки DLL. Если я вместо этого отправлю это так:

rem call dll and get string
dim mystring as string=mydll.getstring()

rem Send it to the webservice
dim FixedString as string = mid(mystring,1,6)
webservice.SaveString(mystring) 

Тогда все работает и все нормально. Это заставляет меня думать, что строка, которую я получил из DLL, в некотором роде неверно завершена. И я не знаю, как это исправить с vb.net (я не могу изменить DLL) и я не знаю заранее, как долго будет длиться строка.

DLL работает только на месте, когда подключено определенное оборудование, поэтому я не могу сидеть в офисе, пытаясь это исправить в dev-среде. Поэтому я хотел бы найти некоторые возможные решения, прежде чем снова обратиться к клиенту.

Редактировать 1: Я попытался сделать цикл с 1 по 100 (потому что я не знаю реальной длины) и попытался скопировать все символы, которые <> "", в новую переменную, но это не сработало. Я не пробовал другие варианты, потому что день прошел, и мне пришлось покинуть сайт клиента.

Редактировать 2:
DLL, с которой я разговариваю, сделана в VB6. Эта DLL общается с другими DLL, созданными на C ++ (я думаю).

Моя программа <-> vb6-DLL <-> c ++ - DLL <-> аппаратное обеспечение

Ответы [ 4 ]

1 голос
/ 10 марта 2009

Ознакомьтесь с документацией MSDN о строках, особенно о:

В .NET Framework объект String может содержать встроенные значения NULL, которые считаются частью длины строки. Однако в некоторых языках, таких как C и C ++, нулевой символ обозначает конец строки, не считается частью строки и не считается частью длины строки. Это означает, что следующие распространенные предположения, которые программисты C и C ++ или библиотеки, написанные на C или C ++, могут сделать о строках, не обязательно действительны при применении к объектам String:

Значение, возвращаемое функциями strlen или wcslen, не обязательно равно String.Length.

Строка, созданная функциями strcpy_s или wcscpy_s, не обязательно идентична строке, созданной методом String.Copy.

Вы должны убедиться, что собственный код C и C ++, который создает экземпляры объектов String, и код, который передается объектам String через вызов платформы, не должны предполагать, что встроенный нуль отмечает конец строки.

Вместо этого я бы сделал что-то вроде:

rem call dll and get string
dim mystring as string=string.intern(mydll.getstring())

(Примечание: я не пробовал это)

0 голосов
/ 11 марта 2009

Строки в VB6 являются BSTR (см. this или Google, чтобы узнать больше ).

BSTR могут не заканчиваться нулем, но все они начинаются с целого числа, обозначающего их длину. Таким образом, у вас есть указатель на блок памяти, который содержит целое число и массив символов Unicode, и этот указатель указывает на строку, но осталось целое число 4 байта, хранящее целое число. Вы не должны сами обращаться к length, вместо этого вы должны вызывать SysStringLen () (функция Win32) для получения длины таких строк.

0 голосов
/ 10 марта 2009

Строки не заканчиваются нулем в .NET, BTW.

Я согласен с ответом выше, в котором говорится, также попробуйте преобразовать в байты и посмотрите на байты.

Если сторонняя организация не может вернуть допустимую строку, то вы также не можете рассчитывать на то, что она не завершит работу вашей программы. Это управляемая DLL или неуправляемый код? Является ли ваша программа многопоточной, и если да, работает ли эта сторонняя неуправляемая DLL в многопоточных средах? Возможно, этого не произойдет, и в этом случае вам придется сериализовать весь доступ к этой DLL.

0 голосов
/ 10 марта 2009

Одна из возможностей - преобразовать его в массив байтов и получить размер массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...