powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Не пойму, что я делаю не так
13 сообщений из 13, страница 1 из 1
Не пойму, что я делаю не так
    #37707770
donpauls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста, как мне подключиться к DLL.
Имеется код для C++:

Код: plaintext
1.
extern "C" void  __declspec(dllexport) __stdcall ctp_Encode7bit(char* in, char* out)



in - входящее значение
out - исходящее значение

Вот комментарий разработчика этой DLL:
"out хотябы на байт больше чем выходная строка, лишнее распределить не страшно"
"ты сам выделяешь память а я ее уже заполняю строкой"
"в принципе ты можешь out точно также определить и инициализировать любой строкой заведомо большого размера или вызвать функцию выделения памяти"

Пробую сделать вот так:

(in заменено на inp
out заменено на outp)

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Declare Sub ctp_Encode7bit Lib "gsmvoice.dll" (ByVal inp As String, ByVal outp As String) 

Public Sub Encode7bit(input_txt As String)
Dim bb as string
Call ctp_Encode7bit(input_txt, bb)
MsgBox bb
End Sub

Private Sub Command1_Click()
Call Encode7bit("123")
End Sub



У меня ничего не получается с таким кодом. Здесь я явно что-то не так делаю.
Подскажите пожалуйста, как правильно?
Как нужно построить код, чтобы на входе задать текст "123" например, а на выходе получить его кодировку, которую сделает функция ctp_Encode7bit?
...
Рейтинг: 0 / 0
Не пойму, что я делаю не так
    #37707776
надо так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Private Declare Sub ctp_Encode7bit Lib "gsmvoice.dll" (ByVal inp As long, ByVal outp As long)

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
sub Encode()
dim src as string
dim dst as string


src = "123"
dst = src ' выделяем память для новой строки чтобы все работало
ctp_Encode7bit strptr(src), strptr(dst)


end sub



единственно не понятно что делает ctp_Encode7bit
если она меняет длину src строки то надо знать как эту длину получать
если len(src)=len(dst) тогда все нормально
иначе надо обрезать dst строку как надо
...
Рейтинг: 0 / 0
Не пойму, что я делаю не так
    #37707848
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
donpauls,

Модератор: Замечание за название топика
не понял, не первый день на форуме ж
...
Рейтинг: 0 / 0
Не пойму, что я делаю не так
    #37708340
надо так,

так не то, чтобы не надо, но в таком виде неверно. Упущено преобразование Unicode-ANSI и обратное. А при ByVal inp As String, ByVal outp As String это делается автоматически
...
Рейтинг: 0 / 0
Не пойму, что я делаю не так
    #37708889
donpauls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
надо такединственно не понятно что делает ctp_Encode7bit
если она меняет длину src строки то надо знать как эту длину получать
если len(src)=len(dst) тогда все нормально
иначе надо обрезать dst строку как надо

если на входе значение "123"
то на выходе будет значение "31D90C"

Как мне вывести значение, которое получается на выходе? Покажите на примере хотя бы msgbox
...
Рейтинг: 0 / 0
Не пойму, что я делаю не так
    #37708920
надо так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор13-й квартал


согласен

просто не помню как себя ведет as String поэтому никогда не пользуюсь ним
и явно задаю адрес
...
Рейтинг: 0 / 0
Не пойму, что я делаю не так
    #37708932
надо так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторdonpauls


как сказано выше надо учитывать преобразование unicode
те

1 как будем двух байтный юникод символ преобразовавать?
можно отбросить просто и останется один байт (но тогда будет в общем случае потеря ифнормации)
а можно не отбрасывать (тогда потери ифнормации не будет)

2 чтобы понять как вывести строку надо понять как эту строку возвращает ctp_Encode7bit
те что в буфере out?
и как определить длину строки
не зная длины не можем правильно определить число получившихся символов
...
Рейтинг: 0 / 0
Не пойму, что я делаю не так
    #37708958
надо так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
sub Encode()
dim src as string
dim dst as string


src = "123"
dst = src & src ' выделяем память для новой строки чтобы все работало
src=StrConv(src, vbStrConv.vbFromUnicode)
ctp_Encode7bit strptr(src), strptr(dst)
dst = StrConv(dst, vbStrConv.vbUnicode) 
msgbox dst

end sub



это если отбросить байт
...
Рейтинг: 0 / 0
Не пойму, что я делаю не так
    #37708994
donpauls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
надо так,

Спасибо большое, теперь работает всё!
...
Рейтинг: 0 / 0
Не пойму, что я делаю не так
    #37710359
donpauls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
надо так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
sub Encode()
dim src as string
dim dst as string


src = "123"
dst = src & src ' выделяем память для новой строки чтобы все работало
src=StrConv(src, vbStrConv.vbFromUnicode)
ctp_Encode7bit strptr(src), strptr(dst)
dst = StrConv(dst, vbStrConv.vbUnicode) 
msgbox dst

end sub



это если отбросить байт

А как чтобы не отбрасывать байт?
Если известно, что строка оканчивается нулем (пустотой)
А то после полезного текста отображается всякий мусор...
...
Рейтинг: 0 / 0
Не пойму, что я делаю не так
    #37710364
donpauls,

dst = Left$(dst, InStr(dst, vbNullChar) - 1)
...
Рейтинг: 0 / 0
Не пойму, что я делаю не так
    #37710548
надо так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторdonpauls

А то после полезного текста отображается всякий мусор...


вообще-то я думал что мусора не должно получиться
не проверял код но если
dst = StrConv(dst, vbStrConv.vbUnicode)
возвращает строку с мусором то надо сделать так
dst = LeftB$(dst, InStrB(dst, vbNullChar) - 1)
dst = StrConv(dst, vbStrConv.vbUnicode)

LeftB InStrB обратите внимание

авторА как чтобы не отбрасывать байт?


не отбрасывать байт значит передать исходную строку в функцию без вызова
src=StrConv(src, vbStrConv.vbFromUnicode)
но это в данном варианте это не будет работать тк
__declspec(dllexport) __stdcall ctp_Encode7bit(char* in, char* out)
определяет длину строки по первому встреченному нулевому символу
а когда строка Unicode длину строки надо определять по первым двум идущим подряд нулевым символам


я вот думаю а нельзя не мучаться и просто реализовать эту функцию ctp_Encode7bit на vb
ведь исходный код есть на C как я понял
...
Рейтинг: 0 / 0
Не пойму, что я делаю не так
    #37711622
donpauls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
надо такне проверял код но если
dst = StrConv(dst, vbStrConv.vbUnicode)
возвращает строку с мусором то надо сделать так
dst = LeftB$(dst, InStrB(dst, vbNullChar) - 1)
dst = StrConv(dst, vbStrConv.vbUnicode)


Теперь без мусора, спасибо!
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Не пойму, что я делаю не так
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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