:: Visual Foxpro, Foxpro for DOS
Re: Преобразование кода из C в VFP9
Victoriacom
Автор

Сообщений: 112
Дата регистрации: 08.12.2010
lulgu
О чем и речь - не читать, а прочитать, это разные вещи.
У вас там полно разных функций - вы для них написали обертки?
Объектную модель для своего устройства разработали?
Использование класса PChart для работы с памятью вы рассматривали?
+
Не помешало бы проверить типы данных:
DECLARE INTEGER CChex_GetNetConfig IN tc-b_new_sdk.dll LONG, INTEGER
Спасибо за совет. Но рано мне еще читать. Делаю рыбу. И буду это делать до тех пор, пока что-нибудь не получится. Хоть что-нибудь! А вот когда получится, буду делать обертки и пр.
У меня нет результата.
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
Victoriacom
Автор

Сообщений: 112
Дата регистрации: 08.12.2010
lulgu
Использование класса PChart для работы с памятью вы рассматривали?
Здесь можно поподробнее. Класс PChart, - это что? Куда посмотреть?



Исправлено 1 раз(а). Последнее : Victoriacom, 23.10.18 12:41
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Victoriacom
lulgu
Использование класса PChart для работы с памятью вы рассматривали?
Здесь можно поподробнее. Класс PChart, - это что? Куда посмотреть?

Прошу прощения, PChar. Поиск покажет несколько версий, мало чем отличающихся.
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Victoriacom
Вот, например, как описан вызов CChex_GetNetConfig с сохранением, так сказать, орфографии
Можно лишь посочувствовать...
Victoriacom
то видно, что IntPtr Buff - адрес памяти, int Len - длина памяти, где должна появиться вышеописанная структура.
Да, похоже на то. Если в доке явно не указано, то посчитай сам размер структуры - int/uint - если это именно старинные сишные, то по 2 байта, но никаких IntPtr в си не было - это похоже на C# - а там уже int это 4-байтные величины.
иногда помогает просто задать заведомо больший размер буфера, и потом уж смотреть чего туда функция написала... 0h+строка_буфер или STRCONV(строка_буфер, 15) позволяют визуализировать в hex дамп содержимое. Поняв что к чему уже можно при помощи substr() и ctobin() или asc() получать "человеческие цифры".

Victoriacom
И еще вопрос.
Как работать с памятью?
Выше я писал. Как правило гораздо проще оставить все вопросы выделения/перераспределения памяти движку фокса, используя STRING @ в декларации вместо всех этих "указателей на структуру".
Но если и самому рулить, то уж точно не надо HeapDestroy() вызывать для кучи самого фоксового процесса - той, чей хендл ты получил от GetProcessHeap().
Вообще лучше создать свою отдельную кучу, не трогая фоксовую - пусть там только сам фоксовый движок резвиться.

Но ещё раз - в 99% "простых случаев", если структуры более-менее "плоские" (без "ссылок на другие структуры"), вполне достаточно создавать прямо в фоксе (без АПИ) строки нужного размера, и передавать их в АПИ через @mystring (@ нужна чтобы получить обратно в фокс-строку изменённую в АПИ функции память. Если этого не надо, т.е. мы только "передаём" но не получаем ничего назад, то @ не нужна - строка в любом случае передаётся в апи в виде "адреса блока памяти").


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Непонятно, о каких структурах и буферах может идти речь, когда у ТС устройство даже не запущено:
1.Make sure that CChex_Start has been started successfully before run.
1.Убедитесь, что CChex_Start был успешно запущен перед запуском.
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
Victoriacom
Автор

Сообщений: 112
Дата регистрации: 08.12.2010
lulgu
Непонятно, о каких структурах и буферах может идти речь, когда у ТС устройство даже не запущено:
1.Make sure that CChex_Start has been started successfully before run.
1.Убедитесь, что CChex_Start был успешно запущен перед запуском.

Это понятно. В самом начале я указал, что вызываю эти функции инициализации.
Это я делаю всегда.
=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
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Вот с этой строкой надо экспериментировать с/без улиткой (@)
DECLARE INTEGER CChex_Update IN tc-b_new_sdk.dll ;
INTEGER nHandle, INTEGER nDevIdx, INTEGER nType, INTEGER ptrBuffer, INTEGER nLen
а не с ее вызовом: CChex_Update(@nHandle, @nDevIdx, @nType, @nAddr, nLen)
Ratings: 0 negative/0 positive
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
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Victoriacom
И опять косяк документации: там просто сказано, что cIp - это ip-адрес. В каком виде - не сказано. В некоторых функциях описано, что это chr(ip1)+chr(ip2)... в общем 4 байта.
Пробовал и так, и "192.168.1.218", - в любом случае возвращается единица. Т.е. успешно.
Если ты задекларировал функцию со STRING в данном параметре, то физически фокс туда будет всегда передавать адрес, т.е. 4 байта. то что "абы какой" адрес, ну там типа 64.255.37.16 функция принимает, вовсе не значит что она успешно его сможет использовать - а так то да, любые 4 байте можно трактовать как некоторый ipv4 адрес
Если функция ожидает именно "4 байта" в данном параметре, т.е. DWORD в терминах WinAPI, то декларировать её нужно используя INTEGER. А само это "число" получать при помощи сравнительно несложных вычислений - только порядок байт стоит предварительно узнать, а так всё тривиально.
Victoriacom
Объявил ее в фоксе как:
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) - это один из многочисленных вариантов, которые я испробовал.
Если объявил INTEGER то и передавай сам адрес, а не указатель на него. Out в данном случае означает что функция в память по этому адресу чего-то запишет, а не что сам адрес она менять будет.
Что они имели в виду под int[] - одному Будде известно. Если это действительно массив, то значит и там требуется адрес блока памяти содержащего элементы этого массива - вот только каким макаром они размерность то этого массива собрались определять, если такового параметра не предусмотрено...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
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.
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
of63
> Если объявил INTEGER то и передавай сам адрес, а не указатель на него.
Мне показалось, что именно обьявление в DECLARE ...INTEGER@ заставит фокс передать в функцию адрес переменной, а не само значение, а не собственно способ вызова функции, т.е. вызов
nHandle = 1
CChex_Update(@nHandle
эквивалентен
nHandle = 1
CChex_Update(nHandle
Просто в первом случае можно будет еще и прочитать значение nHandle, если функция его поменяет. Другими словами, передача параметра в функцию DECLARE управляется именно обьявлением в ней INTEGER@ или INTEGER.

IntPtr это обычный INTEGER и никаких @ не требуется.
Но для Handle его лучше было бы объявить как LONG:
DECLARE LONG CChex_Start IN tc-b_new_sdk.dll
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
В фоксе, в DECLARE, INTEGER и LONG - синонимы.

> IntPtr это обычный INTEGER и никаких @ не требуется
вот это и надо проверять, экспериментировать... "Ptr" же что-то обозначает, или не обозначает )
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
of63
В фоксе, в DECLARE, INTEGER и LONG - синонимы.
> IntPtr это обычный INTEGER и никаких @ не требуется
вот это и надо проверять, экспериментировать... "Ptr" же что-то обозначает, или не обозначает )

Ну, это вам к ИК, он такое любит.
Все-таки я предпочитаю иметь дело с реальными кодами, а не с рассуждениями о кодах.
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Правильно! Кодить надо, а не рассуждать!
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
"Здесь вам не Англия! Копать надо глубже!.." \m/
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
of63
Правильно! Кодить надо, а не рассуждать!

Можете начинать, все затаили дыхание.
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Ну что, всё не дышищь?

Анек.
Жена в последний момент успевает спрятать любовника под кровать. Он лежит там скрюченый, затаив дыхание. Малыш, который все это наблюдал, выбрался из своей кроватки и подполз к горе-любовнику: - Ну сто - не дысыс ? А как дысал, как дысал !...
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Придется выдохнуть, тревога оказалась ложной.



Исправлено 1 раз(а). Последнее : lulgu, 25.10.18 13:15
Ratings: 0 negative/0 positive
Re: Преобразование кода из C в VFP9
Victoriacom
Автор

Сообщений: 112
Дата регистрации: 08.12.2010
lulgu
Все-таки я предпочитаю иметь дело с реальными кодами, а не с рассуждениями о кодах.

Получил от китайцев проект на 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. Может там что-нибудь нарою.
Ratings: 0 negative/0 positive
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.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 20 Baga  (Гостей: 19)

© 2000-2024 Fox Club 
Яндекс.Метрика