|
Помогите перевести с VB на С
|
|||
---|---|---|---|
#18+
В коде VB (который круче) написано: Код: 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.
В коде C[++] пока написано: Код: plaintext 1. 2. 3. 4. 5.
(перечислением всех констант на своем языке (в *.h файлах) автор сишного кода не увлекается, а тема редкая, в google так просто не найдешь) Надо записать параметры как в VB. Есть слабая надежда что &H0 это 0 и AddEmpty() это тоже 0. Главное мне правильно прописать .InfoMask и .CIPMask в сишном коде. Сижу-с туплю-с. Да, побираюсь, а кому счас легко. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2012, 15:28 |
|
Помогите перевести с VB на С
|
|||
---|---|---|---|
#18+
> Автор: Дмитрий77 > Главное мне правильно прописать .InfoMask и .CIPMask в сишном коде. Делаем простую проверку: Код: 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.
:) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2012, 16:22 |
|
Помогите перевести с VB на С
|
|||
---|---|---|---|
#18+
Игорь, Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Как-то не так, формат не тот? Хорошо, я пошел другим путем. 1) VB6 приложение для процедуры, что я сейчас имплементирую (Send Fax, а не receive!!!), команду LISTEN_REQ вообще не посылает, при этом факс отправляет 2) Opal (C++) при старте LISTEN_REQ посылает, но в режиме аудио-only совместимости 3) Я запустил третье приложение (кодов от которого нету, но кот. поддерживает и голос и факс, не уверен на счет G4, не суть) и в дебаге CAPI прочел следующее: Код: plaintext 1.
Т.е. в явном виде константы, кот. наверно хочу. Я забабахал в Opal Код: vbnet 1. 2.
Так дебаг CAPI мне нарисовал все в обратном порядке. Код: plaintext 1.
Только когда я забабахал Код: plaintext 1. 2.
Мне Opal в CAPI логе выдал то же что и приложение упомянутое в п.3 Самое печальное то, что проблему, которую я надеялся этим решить, я не решил. У меня есть 2 CAPI системы для тестов (от разных производителей на 2-х компьютерах). 1)VB-код шлет факс нормально через обе из них. 2) Я скажем так успешно внедрил уже процедуру отправки факса в Opal, но a) Opal через одну систему шлет нормально. б) Opal через другую систему шлет весь факс быстро в куче, т.е. последовательность Код: vbnet 1. 2. 3. 4. 5.
почему-то на второй системе отрабатывает за долю секунды, факс соответственно проходит хлопком и 9 буферов данных по 2048 байт не спасают, куда больше... Сравнивал CAPI логи, логических ошибок REQ/CONF не нашел, стал грешить на LISTEN_REQ которую не делает VB. Мимо...обидно. Будем разбираться дальше... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2012, 18:21 |
|
Помогите перевести с VB на С
|
|||
---|---|---|---|
#18+
Игорь, за внимание спасибо Вопрос к тем кто с C++ знаком. Не взгляните? Правильно ли делаю указатель на массив данных? Но чет у меня надежды мало там ответ получить. На Opal-овского разработчика пока тоже особо не рассчитываю, код как бы "мой". Т.е. считываем данные в BYTE массив 2048 байт, а в функцию надо передать указатель на массив. В VB это звучит так (оба варианта с VarPtr рабочие): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
А C-шный код у меня на одной системе работает, а на другой не работает правильно, кажется не передает правильные данные, причем сравнения через всевозможные дебаги и проверки ключа к разгадке не дают. Исходники VB в принципе могу выложить целиком, как в полном оригинальном(OCX), так и в моем усеченном варианте(только рассматриваемая процедура). ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2012, 15:54 |
|
Помогите перевести с VB на С
|
|||
---|---|---|---|
#18+
Дмитрий77, сразу предупрежу, с++ не знаю. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Значение переменной типа int 'преобразуете' в WORD и запихиваете в массив BYTE. Ничего не смущает ? Код: vbnet 1. 2.
ЗЗЫ: вполне может быть, что моё замечание - 'бред сумасшедшего'. Если так, просьба к модератору - удалить этот пост. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2012, 23:19 |
|
Помогите перевести с VB на С
|
|||
---|---|---|---|
#18+
скукотища Код: plaintext 1.
нет, не смущает. Это досадная апечатка в посте. Изначально делал Код: plaintext 1.
потом не зная что еще попробовать сделал (с Warning естественно) Код: plaintext 1.
а когда писал пост решил добавить для приличия, с дуру ляпнул WORD вместо BYTE. Могу сказать одно: Код Код: plaintext 1. 2. 3.
и код Код: vbnet 1. 2. 3. 4. 5.
Дают абсолютно одинаковые распечатки (для одного и того же sff файла). Отсюда вывод: массив в 2048 байт на C++ и на VB я заполняю одинаково. А вот в указателе на массив в C++ я возможно напортачил, знать бы как. Я смотрел еще раз в CAPI логи, там есть опция CAPI DATA -> Extract Requests as Raw Binary Data Так вот в "плохом" C++ варианте объем этих данных ~3,2кб, а в VB варианте ~83кб (что ~ соответствует размеру передаваемого факса). Т.е. данные массива (правильного) почему то не передаются как должно. Беда думаю с SetPtr, хотя странно почему одно приложение съедает, а другое нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2012, 23:45 |
|
Помогите перевести с VB на С
|
|||
---|---|---|---|
#18+
> ... > Дают абсолютно одинаковые распечатки (для одного и того же sff файла). > Отсюда вывод: массив в 2048 байт на C++ и на VB я заполняю одинаково. То, что приводите в c++ к 32-х битному целому, а в VB - к 16-и битному, - мелочи и к теме топика не относится. Или снова досадна опечатка ? :) Продолжу бредить. > Беда думаю с SetPtr, хотя странно почему одно приложение съедает, а другое нет. Потому что одно приложение выполняется 32-х разрядным процессором, а другое - 64-х разрядным. :) А если изменить описание сруктуры? Совсем 'чуть-чуть'... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2012, 00:43 |
|
Помогите перевести с VB на С
|
|||
---|---|---|---|
#18+
скукотищаТо, что приводите в c++ к 32-х битному целому, а в VB - к 16-и битному, - мелочи и к теме топика не относится. Или снова досадна опечатка ? :) В данном случае делается исключительно для теста, распечатка выглядит примерно так Код: 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.
Т.е. выше размерности BYTE не прыгнем, хоть к 16-битному, хоть к 32-битному, а если тупо распечатывать байты, то байты и будут печататься, и будут иероглифы как в "DataB3Req.SubCommand=Ђ", где я к int привести поленился. Это делается исключительно для проверки, чтоб понять что в C++ я формирую такие же массивы байтов как в полностью рабочем VB-коде. скукотищаПродолжу бредить. Продолжайте, может истину родим. скукотища> Беда думаю с SetPtr, хотя странно почему одно приложение съедает, а другое нет. Потому что одно приложение выполняется 32-х разрядным процессором, а другое - 64-х разрядным. :) Проверить это можно. Для этого надо установить CAPI-приложение, которое "съедает" (из п.(1)) на "64-разрядный" комп, есть у меня 3-й тестовый комп, но что-то подсказывает, что оно будет там работать. OK, проверю. Это быстрее, чем тупо смотреть в коды и логи. скукотища> А если изменить описание сруктуры? Совсем 'чуть-чуть'... Код: plaintext 1. 2. 3. 4. 5.
Проверю, конечно, но это вряд ли что-то даст. #if P_64BIT означает 64-битное приложение, а не 64-битный процессор (или 64-битная OS). А я всегда компилирую dll как 32-битное приложение (VC++2005 Express Edition по другому и не умеет), поэтому #if P_64BIT итак никогда не выполняется и m_Data64 по любому не используется. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2012, 01:40 |
|
Помогите перевести с VB на С
|
|||
---|---|---|---|
#18+
> Дмитрий77 > Проверю, конечно, но это вряд ли что-то даст. > ... Тогда и проверять не стоит. Я думал, что P_64BIT имеет отношение к разрядности процессора. На данный момент единственное, что ещё пришло в голову - установить, если это возможно, 'CAPI-систему от производитель #2 (Te-systems, X-CAPI)' на компьютер с 32-х разрядным процессором. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2012, 01:47 |
|
Помогите перевести с VB на С
|
|||
---|---|---|---|
#18+
скукотища, пока проверил CAPI-система от производитель #1 (ComISDN) OS=WinXP 32bit; Комп новый(64бит, 2 процессора) (компьютер другой, но xp та же, даже та же "лицензия" использована -оказывается можно, Microsoft пока не поймал -гы) >установить, если это возможно, 'CAPI-систему от производитель #2 (Te-systems, X-CAPI)' на компьютер с 32-х разрядным процессором. Это надо на P-III, удалять ComISDN, устанавливать X-CAPI, неохота, и результат предполагаю будет отрицательный (если в курсе то на одном компе==OS может стоять одновременно только одна capi2032.dll). В документации CAPI 2.0 сказано так: 5.17 DATA_B3_REQ Description This message sends data within the logical connection identified by the NCCI. Data to be sent are referenced by the parameters Data/Data length. The data is not contained in the message: a 32-bit pointer is used to transfer the address of the data area. The application issues a unique identifier for this data block in the parameter Data handle. This handle is used in a later DATA_B3_CONF. Parameter Type Comment NCCI dword Network Control Connection Identifier Data dword Pointer to the data to be sent Data length word Size of data area to be sent Data handle word Referenced in DATA_B3_CONF Flags word [0]: Qualifier bit [1]: More-data bit [2]: Delivery confirmation bit [3]: Expedited data [4]: UI frame [5] to [15]: reserved Data64 qword For 64bit applications: 64-bit pointer to the data to be sent. Note The data transfer does not support assembly or re-assembly of data. An application must not change or free the data area before the corresponding Ну для реализации последнего как раз и используется 8 буферов с перестраховкой, это при том что данные посылаются в 3 потока. Причем по CAPI логу я проверил, что 4-й CAPI_DATA_B3_REQ посылается четко после получения первого CAPI_DATA_B3_CONF, и т.д., т.е. перетирания данных в массивах быть не может, только он фигню видимо посылает вместо правильных данных, и почему-то только во втором варианте 'от производитель #2 (Te-systems, X-CAPI)', при этом Data length передается 2048 -это видно в CAPI логе. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2012, 02:31 |
|
Помогите перевести с VB на С
|
|||
---|---|---|---|
#18+
Короче нашел зарытую собаку, а с указателем все правильно у меня, если сделать конечно скидку на оч. слабое знание C++, курица пишет лапой. 1. сделал (почти уже в отчаянии) Код: plaintext 1. 2. 3.
и, о чудо, мелкими блоками по 160 байт CAPI-система от производитель #2 (Te-systems, X-CAPI) факс прошел на ура!!! 160 взял не совсем случайно - это стандартная длина фрейма для голосового кодека. 2. Дальше прозрение пришло быстро. VB-код: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
С++ код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Когда сделал: Код: plaintext 1. 2. 3. 4. 5.
все заработало как часики. Т.е. я формировал корректный массив 2048 байт, делал на него правильный указатель, CAPI-система молча отсчитывала от него первые 160 байтов, руководствуясь глобальными инструкциями, полученными при регистрации приложения и быстрехонько отсылала DATA_B3_CONF. При этом 160 байтов таки хватало для принятия заголовка SFF-файла (типа нормальные данные а не туфта), посему некое короткое подобие факса "в полосочку" таки "передавалось". Остается вопрос почему таки работало первое приложение. Скорее всего тупо игнорировало инструкции в m_capi->REGISTER(), а делало приоритет на инструкции команды CAPI_DATA_B3_REQ, где указывалось DataLenth=2048. Практика такова, что всякие RFC и стандарты вендорами далеко не всегда соблюдаются, иногда не соблюдаются нарочно, дабы обеспечить максимальную совместимость с теми кто не соблюдает, так все и живут. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2012, 23:31 |
|
Помогите перевести с VB на С
|
|||
---|---|---|---|
#18+
Дмитрий77, поздравляю. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2012, 23:50 |
|
Помогите перевести с VB на С
|
|||
---|---|---|---|
#18+
А все-таки надо: Код: plaintext 1. 2. 3. 4. 5.
VB-OCX написана только для факса. Opal работает как с факсами так и с голосом, в частности сам факс можно передавать поверх голосового канала, и если залепить 2048, то факс по голосовому каналу например не проходит, т.к. начинает слать голосовые фреймы по 2048 байт, что недопустимо для нормальной работы Ulaw/Alaw. Сравнил с еще одним VOICE-FAX приложением (коммерческим) и понял что надо делать 160. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2012, 17:48 |
|
|
start [/forum/topic.php?fid=60&msg=37804981&tid=2157756]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 285ms |
total: | 418ms |
0 / 0 |