Re: Преобразование кода из C в VFP9 | |
---|---|
Victoriacom Автор Сообщений: 112 Дата регистрации: 08.12.2010 |
Спасибо за совет. Но рано мне еще читать. Делаю рыбу. И буду это делать до тех пор, пока что-нибудь не получится. Хоть что-нибудь! А вот когда получится, буду делать обертки и пр. У меня нет результата. |
Re: Преобразование кода из C в VFP9 | |
---|---|
Victoriacom Автор Сообщений: 112 Дата регистрации: 08.12.2010 |
Здесь можно поподробнее. Класс PChart, - это что? Куда посмотреть? Исправлено 1 раз(а). Последнее : Victoriacom, 23.10.18 12:41 |
Re: Преобразование кода из C в VFP9 | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
Прошу прощения, PChar. Поиск покажет несколько версий, мало чем отличающихся. |
Re: Преобразование кода из C в VFP9 | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Можно лишь посочувствовать... Да, похоже на то. Если в доке явно не указано, то посчитай сам размер структуры - int/uint - если это именно старинные сишные, то по 2 байта, но никаких IntPtr в си не было - это похоже на C# - а там уже int это 4-байтные величины. иногда помогает просто задать заведомо больший размер буфера, и потом уж смотреть чего туда функция написала... 0h+строка_буфер или STRCONV(строка_буфер, 15) позволяют визуализировать в hex дамп содержимое. Поняв что к чему уже можно при помощи substr() и ctobin() или asc() получать "человеческие цифры". Выше я писал. Как правило гораздо проще оставить все вопросы выделения/перераспределения памяти движку фокса, используя STRING @ в декларации вместо всех этих "указателей на структуру". Но если и самому рулить, то уж точно не надо HeapDestroy() вызывать для кучи самого фоксового процесса - той, чей хендл ты получил от GetProcessHeap(). Вообще лучше создать свою отдельную кучу, не трогая фоксовую - пусть там только сам фоксовый движок резвиться. Но ещё раз - в 99% "простых случаев", если структуры более-менее "плоские" (без "ссылок на другие структуры"), вполне достаточно создавать прямо в фоксе (без АПИ) строки нужного размера, и передавать их в АПИ через @mystring (@ нужна чтобы получить обратно в фокс-строку изменённую в АПИ функции память. Если этого не надо, т.е. мы только "передаём" но не получаем ничего назад, то @ не нужна - строка в любом случае передаётся в апи в виде "адреса блока памяти"). ------------------ WBR, Igor |
Re: Преобразование кода из C в VFP9 | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
Непонятно, о каких структурах и буферах может идти речь, когда у ТС устройство даже не запущено:
1.Make sure that CChex_Start has been started successfully before run. 1.Убедитесь, что CChex_Start был успешно запущен перед запуском. |
Re: Преобразование кода из C в VFP9 | |
---|---|
Victoriacom Автор Сообщений: 112 Дата регистрации: 08.12.2010 |
Это понятно. В самом начале я указал, что вызываю эти функции инициализации. Это я делаю всегда. =CChex_Init() nHandle = CChex_Start() и еще nRet = CCHex_ClientConnect(nHandle, cIp, nPort) И опять косяк документации: там просто сказано, что cIp - это ip-адрес. В каком виде - не сказано. В некоторых функциях описано, что это chr(ip1)+chr(ip2)... в общем 4 байта. Пробовал и так, и "192.168.1.218", - в любом случае возвращается единица. Т.е. успешно. Заткнулся я на вызове парной CChex_Update. В SDK написано: [Mode] int CChex_Update(IntPtr CchexHandle, int[] DevIdx, int[] Type, IntPtr Buff, int Len); [Parameter];CchexHandle,CChex_Start successfully create the handle; Input[Parameter] - Input, значит я передаю DevIdx,Device index returned asynchronously,Output[Parameter]; - Output, значит я должен получить Buff,Returned data section,Output [Parameter]; - тоже получить Len,Returns the length of the data section,Input[Parameter] - длина буфера - понятно, я передаю Объявил ее в фоксе как: DECLARE INTEGER CChex_Update IN tc-b_new_sdk.dll ; INTEGER nHandle, INTEGER nDevIdx, INTEGER nType, INTEGER ptrBuffer, INTEGER nLen Вызываю: nRet = CChex_Update(@nHandle, @nDevIdx, @nType, @nAddr, nLen) - это один из многочисленных вариантов, которые я испробовал. И хоть ты тресни(!), возвращает -1 (неуспешно). Ни в nDevIdx, ни в nType, а тем более в буфер по адресу nAddr - ничего не передается. Отписал разработчикам, но похоже мы разговариваем на разных языках (не имея ввиду русский и английский). Исправлено 1 раз(а). Последнее : Victoriacom, 24.10.18 10:12 |
Re: Преобразование кода из C в VFP9 | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Вот с этой строкой надо экспериментировать с/без улиткой (@)
|
Re: Преобразование кода из C в VFP9 | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
Victoriacom
В DataPart есть описание IP, возможно что в Фоксе это тип STRING: byte [4]IpAddr;// IP address Параметры для CChex_Update могут где-то формироваться неявно по цепочке. Запустите все что можно кроме этой функции. Попробуйте на примерах выяснить, что может означать выражение int[] - возможно что в Фоксе это тоже тип STRING. Посмотрите, есть ли в документации какие-либо описания структур и перечислений. Да, посмотрите, есть ли в поставке файлы .h. Исправлено 2 раз(а). Последнее : lulgu, 24.10.18 12:37 |
Re: Преобразование кода из C в VFP9 | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Если ты задекларировал функцию со STRING в данном параметре, то физически фокс туда будет всегда передавать адрес, т.е. 4 байта. то что "абы какой" адрес, ну там типа 64.255.37.16 функция принимает, вовсе не значит что она успешно его сможет использовать - а так то да, любые 4 байте можно трактовать как некоторый ipv4 адрес Если функция ожидает именно "4 байта" в данном параметре, т.е. DWORD в терминах WinAPI, то декларировать её нужно используя INTEGER. А само это "число" получать при помощи сравнительно несложных вычислений - только порядок байт стоит предварительно узнать, а так всё тривиально. Если объявил INTEGER то и передавай сам адрес, а не указатель на него. Out в данном случае означает что функция в память по этому адресу чего-то запишет, а не что сам адрес она менять будет. Что они имели в виду под int[] - одному Будде известно. Если это действительно массив, то значит и там требуется адрес блока памяти содержащего элементы этого массива - вот только каким макаром они размерность то этого массива собрались определять, если такового параметра не предусмотрено... ------------------ WBR, Igor |
Re: Преобразование кода из C в VFP9 | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
> Если объявил INTEGER то и передавай сам адрес, а не указатель на него.
Мне показалось, что именно обьявление в DECLARE ...INTEGER@ заставит фокс передать в функцию адрес переменной, а не само значение, а не собственно способ вызова функции, т.е. вызов nHandle = 1 CChex_Update(@nHandle эквивалентен nHandle = 1 CChex_Update(nHandle Просто в первом случае можно будет еще и прочитать значение nHandle, если функция его поменяет. Другими словами, передача параметра в функцию DECLARE управляется именно обьявлением в ней INTEGER@ или INTEGER. |
Re: Преобразование кода из C в VFP9 | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
IntPtr это обычный INTEGER и никаких @ не требуется. Но для Handle его лучше было бы объявить как LONG: DECLARE LONG CChex_Start IN tc-b_new_sdk.dll |
Re: Преобразование кода из C в VFP9 | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
В фоксе, в DECLARE, INTEGER и LONG - синонимы.
> IntPtr это обычный INTEGER и никаких @ не требуется вот это и надо проверять, экспериментировать... "Ptr" же что-то обозначает, или не обозначает ) |
Re: Преобразование кода из C в VFP9 | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
Ну, это вам к ИК, он такое любит. Все-таки я предпочитаю иметь дело с реальными кодами, а не с рассуждениями о кодах. |
Re: Преобразование кода из C в VFP9 | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Правильно! Кодить надо, а не рассуждать!
|
Re: Преобразование кода из C в VFP9 | |
---|---|
Simple777 Сообщений: 33855 Дата регистрации: 05.11.2006 |
"Здесь вам не Англия! Копать надо глубже!.."
|
Re: Преобразование кода из C в VFP9 | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
Можете начинать, все затаили дыхание. |
Re: Преобразование кода из C в VFP9 | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Ну что, всё не дышищь?
Анек. Жена в последний момент успевает спрятать любовника под кровать. Он лежит там скрюченый, затаив дыхание. Малыш, который все это наблюдал, выбрался из своей кроватки и подполз к горе-любовнику: - Ну сто - не дысыс ? А как дысал, как дысал !... |
Re: Преобразование кода из C в VFP9 | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
Придется выдохнуть, тревога оказалась ложной.
Исправлено 1 раз(а). Последнее : lulgu, 25.10.18 13:15 |
Re: Преобразование кода из C в VFP9 | |
---|---|
Victoriacom Автор Сообщений: 112 Дата регистрации: 08.12.2010 |
Получил от китайцев проект на C#. (Мне это, как граната для обезъяны. Вижу впервые. Любопытно...) С горем пополам запустил отладчик. Первое, что увидел, - память под буфер распределяется командой pBuff = Marshal.AllocHGlobal(len) - это что за зверь? освобождается Marshal.FreeHGlobal(pBuff) pBuff имеет тип System.IntPtr Вызов злополучной функции находится почему-то в таймере с интервалом 100. ret = AnvizNew.CChex_Update(anviz_handle, dev_idx, Type, pBuff, len); Типы там такие anviz_handle - System.IntPtr dev_idx - int[] - когда раскрываю подробности, там стоит int[1] = 1. Что это, массив Integer'ов? Type - int[] pBuff - System.IntPtr len - int При запуске формы вызывается бесчисленное количество раз с результатом 0 (неуспешно). Потом, на форме нажимаю кнопку Start, и видимо после этого таймер останавливается. Потому что дальше функция вызывается уже по делу. И с результатом. Повторяю в фоксе последовательность вызовов Сишных функций. =CChex_Init() phHandle = CChex_Start() pnPort = CChex_Get_Service_Port(phHandle) pnSDKVer = CChex_Version() nRet = CCHex_ClientConnect(phHandle, @cIp, pnPort) && cIp = "192.168.1.222" Всё отрабатывает на ура. Но дальше нужно вызвать пресловутый CChex_Update, чтобы получить в буфере нужную структуру. И облом. Возвращает минус 1 и пустой буфер. Я думаю, проблема в System.IntPtr. Или в выделении памяти Marshal.AllocHGlobal(len). Или в черт знает в чем еще. Когда общаюсь с китайцами, у них замечательный ответ на всё: у нас все работает. Поизучаю проект в Visual Studio. Может там что-нибудь нарою. |
Re: Преобразование кода из C в VFP9 | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
Возможно, их код универсальный для разных платформ.
Но у вас фокс, так что это ваши проблемы, а не китайцев. Посмотрите еще раз тщательно файлы /h, там должны быть определения int[] DevIdx, int[] Type,. Буфер это не структура. Буфер декларируется так - ,STRING @lcBuffer,INTEGER lnLenBuff, Попробуйте, вернется ли хоть что-то: lnLenBuff = 100 lcBuffer = REPLICATE(CHR(0),lnLenBuff) IntPtr это INTEGER, но может оказаться LONG, STRING. Для работы с памятью вам достаточно PChar. |
© 2000-2024 Fox Club  |