|
Не могу на VB6 осилить Type[struct], Long/String [char */ IntPtr + Marshal.StringToCoTask]
|
|||
---|---|---|---|
#18+
C# смотрел, ну эт надо учебники штудировать, чтоб на нем чего-то серьезно делать, метод тыка не нравится. Пытаюсь все-таки осилить Opal API под VB6, проводя аналогию с имеющимся кодом C#. Чуток продвинулся. В C# условно (условно, потому что я опустил пока борьбу с union, кот. в C# реализована через [FieldOffset(0)]) имеем: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
На VB6 накатал сначала следующее: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
В логе Opal прочитал: vb6 OpalC API Handling message CmdRegistration from application vb6 OpalC API Command CmdRegistration error: No such protocol prefix т.е. NewMes.m_param.m_protocol = VarPtr("sip") слово "sip" передала неправильно Исправил на Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
-это место типа прошел, лог стал ругаться на hostname и т.д. Пошел дальше: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
В логе вижу, что вроде как процесс пошел: 0:03.503 opalvb SIP Constructed REGISTER handler for sip:100@192.168.11.3 0:03.503 opalvb SIP Executing state change to Subscribing for REGISTER handler, Но VB6 app после этого вызова вылетает...( если в Public Type OpalParamRegistration сделать более одного As String) Чего-то я не догоняю...какой-то VB6 хитрости.. на чего заменить IntPtr и Marshal.StringToCoTaskMemAnsi(value)? В оригинале (откуда эта API вызывается) Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2012, 04:46 |
|
Не могу на VB6 осилить Type[struct], Long/String [char */ IntPtr + Marshal.StringToCoTask]
|
|||
---|---|---|---|
#18+
Дмитрий77, может сделать строки nullterminated? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2012, 11:35 |
|
Не могу на VB6 осилить Type[struct], Long/String [char */ IntPtr + Marshal.StringToCoTask]
|
|||
---|---|---|---|
#18+
скукотищаможет сделать строки nullterminated? Что конкретно имеете в виду? Если сделать Код: vbnet 1. 2. 3.
то вышибает точно также при попытке передать более одного строкового параметра Если делать Код: vbnet 1.
то vb6 OpalC API Command CmdRegistration error: No such protocol prefix (в смысле не читает слово "sip" как задумано, при этом от вылета при добавлении второго String/String*255 параметра не спасает) Я тут вычитал, что String надо передавать как ByVal, но у меня Message As OpalMessageRegistration, (можно только ByRef) а string засунуто в структуры Мне по идее надо передать указатели на эти String, но с Long + VarPtr/StrPtr ничего не получается (самый верхний VB6 пример) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2012, 15:37 |
|
Не могу на VB6 осилить Type[struct], Long/String [char */ IntPtr + Marshal.StringToCoTask]
|
|||
---|---|---|---|
#18+
Дмитрий77, Код: vbnet 1. 2. 3.
Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2012, 16:47 |
|
Не могу на VB6 осилить Type[struct], Long/String [char */ IntPtr + Marshal.StringToCoTask]
|
|||
---|---|---|---|
#18+
скукотища Код: vbnet 1. 2. 3.
Код: vbnet 1.
Не работает. Command CmdRegistration error: No such protocol prefix По идее типы со String в VB встречаются: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Но отличия: 1. Там оригинал LPCTSTR/LPTSTR, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
а у меня оригинал const char * Код: plaintext 1. 2.
2. Там ByVal (pOpenfilename As OPENFILENAME) а у меня ByRef Message As OpalMessageRegistration и ByVal сделать не дает. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2012, 17:07 |
|
Не могу на VB6 осилить Type[struct], Long/String [char */ IntPtr + Marshal.StringToCoTask]
|
|||
---|---|---|---|
#18+
Я думаю что все-таки VB6 должен передавать Strings, а не указатели. потому что все as Strings как раз передаются корректно, но почему-то VB6 вылетает Дмитрий77 Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
В логе вижу, что вроде как процесс пошел: 0:03.503 opalvb SIP Constructed REGISTER handler for sip:100@192.168.11.3 0:03.503 opalvb SIP Executing state change to Subscribing for REGISTER handler, Но VB6 app после этого вызова вылетает...( если в Public Type OpalParamRegistration сделать более одного As String) Т.е. Opal правильно схватил по крайней мере первые 2 стринга. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2012, 17:21 |
|
Не могу на VB6 осилить Type[struct], Long/String [char */ IntPtr + Marshal.StringToCoTask]
|
|||
---|---|---|---|
#18+
Короче правильно все-таки так (const char *(C++) ==> IntPtr(C#) ==>As String (VB6) ): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Код Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
вылетает и-за NewMes.m_param.m_timeToLive = 300 !!! но без этой строчки 'Time in seconds between registration updates. If this is zero then 'the identifier is unregistered from the server. 'm_timeToLive As Long(вместо register ) UnRegister без m_timeToLive = 300 (=0 по дефолту) Opal судя по логу делает, т.е. API с кучей стрингов срабатывает. Если уж делать, то надо чтоб все работало!!! Я не поленился сделать то-же самое на VB.NET через обертку на C# (которую упомянал в соседнем топике) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
результат такой-же!!! вылетает и-за этой же строчки: NewMes.m_param.m_registrationInfo.m_timeToLive = 300 Обертку C# писал не я!!! В оригинале структура целиком на C++ такая: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Т.е. теперь что, с unsigned(C++)/uint(C#)???UInteger(VB.NET)/???Long(VB6) бороться? Идеи есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2012, 19:35 |
|
Не могу на VB6 осилить Type[struct], Long/String [char */ IntPtr + Marshal.StringToCoTask]
|
|||
---|---|---|---|
#18+
As Long это так: Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2012, 23:13 |
|
Не могу на VB6 осилить Type[struct], Long/String [char */ IntPtr + Marshal.StringToCoTask]
|
|||
---|---|---|---|
#18+
>вылетает и-за >NewMes.m_param.m_timeToLive = 300 Походу с типом вообще все правильно Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
m_timeToLive As Long -число 300 правильно передается. Разница кажется кроется в том, что API ф-ция OpalSendMessage Оригинал: Код: plaintext 1.
Которую я задекларировал как Long Код: vbnet 1. 2.
может возвращать ошибку: The return value is another message which will have a type of OpalIndCommandError if an error occurs. The OpalMessage::m_commandError field will contain a string indicating the error that occurred. И в этом случае As Long "справляется", а может возвращать такую же навороченную структуру If successful, the the type of the message is the same as the command type. А поскольку я все параметры задал правильно, процесс пошел, и ф-ция возвращает "the the type of the message is the same" Public Declare Function OpalSendMessageRegistration... As Long и это As Long приводит к вылету VB6. Но это надо разбираться дальше. Хотя странно почему VB.NET тоже вылетает...надо поэкспериментировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2012, 23:19 |
|
Не могу на VB6 осилить Type[struct], Long/String [char */ IntPtr + Marshal.StringToCoTask]
|
|||
---|---|---|---|
#18+
>вылетает и-за >NewMes.m_param.m_timeToLive = 300 Короче зря позарился на "новую версию". Сунул тупо более старые версии opal/ptlib (2-х летней давности), даже не убирая "новоявленных" параметров из структур, и с тем же кодом все зарегистрировалось, long вернулся, ни VB6 ни VB.NET не вылетели. Это внутренние проблемы Opal и их исправление выходит за рамки вопроса. Автор как всегда кучу всего улучшает, при этом как всегда куча всего ломается. Чтож, попробую поизучать API дальше. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2012, 00:29 |
|
Не могу на VB6 осилить Type[struct], Long/String [char */ IntPtr + Marshal.StringToCoTask]
|
|||
---|---|---|---|
#18+
Дмитрий77>вылетает и-за >NewMes.m_param.m_timeToLive = 300 Походу с типом вообще все правильно Код: vbnet 1. 2. 3. 4. 5.
Кажется понял еще задницу. Ф-ция Код: vbnet 1. 2.
на вход принимает ByRef Message As OpalMessageRegistration где параметры вложенных структур должны быть As String А на выходе As Long -это указатель на такой же As OpalMessageRegistration со вложенным OpalParamRegistration, но предварительные игры с CopyMemory наталкивают на мысль, что возвращаемая структура уже будет с указателями, а не с as String, т.е. Код: vbnet 1. 2. 3. 4. 5.
Это что, получается теперь 1) дублировать всю эту иерархию структур для входа/выхода? 2) И на выходе делать сначала CopyMemory чтобы получить структуру в том числе с указателями по указателю на структуру что возвращает ф-ция 3) Потом CopyMemory в String для каждого параметра который суть указатель Тяжеловато... Ну на VB.NET рабочий код подобного получился примерно такой: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
А что будет на VB6, о господи, с расщепленными Union и продублированными на вход/выход структурами... Чет какая-то фигня... сначала типа для проверки делаю на .NET (которого не знаю), а потом мучительно-извращенно перетаскиваю назад на VB6. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2012, 20:51 |
|
Не могу на VB6 осилить Type[struct], Long/String [char */ IntPtr + Marshal.StringToCoTask]
|
|||
---|---|---|---|
#18+
Дмитрий77Кажется понял еще задницу. Ф-ция Код: vbnet 1. 2.
на вход принимает ByRef Message As OpalMessageRegistration где параметры вложенных структур должны быть As String А на выходе As Long -это указатель на такой же As OpalMessageRegistration со вложенным OpalParamRegistration, но предварительные игры с CopyMemory наталкивают на мысль, что возвращаемая структура уже будет с указателями, а не с as String, т.е. Это что, получается теперь ... 2) И на выходе делать сначала CopyMemory чтобы получить структуру в том числе с указателями по указателю на структуру что возвращает ф-ция 3) Потом CopyMemory в String для каждого параметра который суть указатель скукотищаДмитрий77, Код: vbnet 1. 2. 3.
Код: vbnet 1.
То что вы предлагаете передает на вход "s" вместо "sip". Почему я ХЗ не знаю. Но то что я решил делать вчера и что вроде как работает, т.е. "As String" 1) Глючит если структура содержит структуру второго/третьего подуровня, в кот. тоже есть as String. 2) Не имеет обратной совместимости с возвращаемыми структурами с указателями. Думаю не стоит VB доверять конвертацию String-ов в указатели на них при передаче в API. Я короче сделал все таки с указателями "на пальцах" (хотя пришлось думать) и мой вариант работает: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60.
Не растранжирить бы память всеми этими махинациями. Переживаю слегка. VB.NET (то же самое) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2012, 06:30 |
|
Не могу на VB6 осилить Type[struct], Long/String [char */ IntPtr + Marshal.StringToCoTask]
|
|||
---|---|---|---|
#18+
Дмитрий77 Но VB6 app после этого вызова вылетает...( если в Public Type OpalParamRegistration сделать более одного As String) Дмитрий77Короче зря позарился на "новую версию". Сунул тупо более старые версии opal/ptlib (2-х летней давности), даже не убирая "новоявленных" параметров из структур, и с тем же кодом все зарегистрировалось, long вернулся, Что интересно, с as Long заданными правильно (как Ptr-ы на правильные char * байт строки) "новая версия" тоже не вылетает и делает чего просют. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2012, 19:45 |
|
|
start [/forum/topic.php?fid=60&msg=37913786&tid=2157513]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 296ms |
total: | 446ms |
0 / 0 |