|
Не пойму, что я делаю не так
|
|||
---|---|---|---|
#18+
Подскажите пожалуйста, как мне подключиться к DLL. Имеется код для C++: Код: plaintext 1.
in - входящее значение out - исходящее значение Вот комментарий разработчика этой DLL: "out хотябы на байт больше чем выходная строка, лишнее распределить не страшно" "ты сам выделяешь память а я ее уже заполняю строкой" "в принципе ты можешь out точно также определить и инициализировать любой строкой заведомо большого размера или вызвать функцию выделения памяти" Пробую сделать вот так: (in заменено на inp out заменено на outp) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
У меня ничего не получается с таким кодом. Здесь я явно что-то не так делаю. Подскажите пожалуйста, как правильно? Как нужно построить код, чтобы на входе задать текст "123" например, а на выходе получить его кодировку, которую сделает функция ctp_Encode7bit? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2012, 03:16 |
|
Не пойму, что я делаю не так
|
|||
---|---|---|---|
#18+
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.
единственно не понятно что делает ctp_Encode7bit если она меняет длину src строки то надо знать как эту длину получать если len(src)=len(dst) тогда все нормально иначе надо обрезать dst строку как надо ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2012, 04:25 |
|
Не пойму, что я делаю не так
|
|||
---|---|---|---|
#18+
donpauls, Модератор: Замечание за название топика не понял, не первый день на форуме ж ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2012, 08:39 |
|
Не пойму, что я делаю не так
|
|||
---|---|---|---|
#18+
надо так, так не то, чтобы не надо, но в таком виде неверно. Упущено преобразование Unicode-ANSI и обратное. А при ByVal inp As String, ByVal outp As String это делается автоматически ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2012, 13:14 |
|
Не пойму, что я делаю не так
|
|||
---|---|---|---|
#18+
надо такединственно не понятно что делает ctp_Encode7bit если она меняет длину src строки то надо знать как эту длину получать если len(src)=len(dst) тогда все нормально иначе надо обрезать dst строку как надо если на входе значение "123" то на выходе будет значение "31D90C" Как мне вывести значение, которое получается на выходе? Покажите на примере хотя бы msgbox ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2012, 17:14 |
|
Не пойму, что я делаю не так
|
|||
---|---|---|---|
#18+
автор13-й квартал согласен просто не помню как себя ведет as String поэтому никогда не пользуюсь ним и явно задаю адрес ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2012, 17:32 |
|
Не пойму, что я делаю не так
|
|||
---|---|---|---|
#18+
авторdonpauls как сказано выше надо учитывать преобразование unicode те 1 как будем двух байтный юникод символ преобразовавать? можно отбросить просто и останется один байт (но тогда будет в общем случае потеря ифнормации) а можно не отбрасывать (тогда потери ифнормации не будет) 2 чтобы понять как вывести строку надо понять как эту строку возвращает ctp_Encode7bit те что в буфере out? и как определить длину строки не зная длины не можем правильно определить число получившихся символов ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2012, 17:37 |
|
Не пойму, что я делаю не так
|
|||
---|---|---|---|
#18+
Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
это если отбросить байт ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2012, 17:48 |
|
Не пойму, что я делаю не так
|
|||
---|---|---|---|
#18+
надо так, Спасибо большое, теперь работает всё! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.03.2012, 18:15 |
|
Не пойму, что я делаю не так
|
|||
---|---|---|---|
#18+
надо так Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
это если отбросить байт А как чтобы не отбрасывать байт? Если известно, что строка оканчивается нулем (пустотой) А то после полезного текста отображается всякий мусор... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2012, 04:03 |
|
Не пойму, что я делаю не так
|
|||
---|---|---|---|
#18+
donpauls, dst = Left$(dst, InStr(dst, vbNullChar) - 1) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2012, 04:41 |
|
Не пойму, что я делаю не так
|
|||
---|---|---|---|
#18+
автор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 как я понял ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2012, 15:36 |
|
Не пойму, что я делаю не так
|
|||
---|---|---|---|
#18+
надо такне проверял код но если dst = StrConv(dst, vbStrConv.vbUnicode) возвращает строку с мусором то надо сделать так dst = LeftB$(dst, InStrB(dst, vbNullChar) - 1) dst = StrConv(dst, vbStrConv.vbUnicode) Теперь без мусора, спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2012, 13:16 |
|
|
start [/forum/topic.php?fid=60&msg=37710359&tid=2157974]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 147ms |
0 / 0 |