powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / declare - dll
13 сообщений из 13, страница 1 из 1
declare - dll
    #35019793
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть такое описание фукции входящей к некую Dll
Код: plaintext
1.
Function AddPerson (PersonData: TPerson; Photo: pointer; PhotoSize: dword; out Person_descr_error : integer): integer; 
вот так я изложил в VFP
Код: plaintext
1.
DECLARE INTEGER AddPerson IN SW_IM.dll STRING @ PersonData, STRING @ Photo, DOUBLE PhotoSize, INTEGER @ Person_descr_error
но не пошло - говорит: "The parameters passed to a DLL caused an exception in the DLL.
Make sure that you pass all the necessary parameters to the DLL and that the parameters are of the proper type." (в моем переводе - ошибка в типе параметров переданных в dll)
думаю что ошибка в последнем параметре
Код: plaintext
out Person_descr_error : integer
как же его декларировать в терминах VFP ?
...
Рейтинг: 0 / 0
declare - dll
    #35019816
Боюсь, что отнюдь не в последнем.
По какому правилу Pointer превратился в string, а не в integr? Указатели перестали быть целыми числами?
Где Вы в Windows API видели тип Double? Или размер файла перестал быть целым числом?
...
Рейтинг: 0 / 0
declare - dll
    #35019833
ВБ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Параметр типа dword объявляется как Long или Integer
Что касается типа pointer, то тут надо смотреть. Изли изображение хранится в распределённой памяти, то указатель на эту память так же передаётся с типом Long (или Integer).
...
Рейтинг: 0 / 0
declare - dll
    #35019861
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
довод 1
другая фукция с такими же параметрами, но без этого последнено, не вызвает такой ошибки

довод 2
http://]http://www.sql.ru/forum/actualthread.aspx?tid=447406&hl=declare

довод 3
help к VFP 8
статья "DECLARE - DLL Command"
...
Рейтинг: 0 / 0
declare - dll
    #35020046
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейОно не пошло - говорит: "The parameters passed to a DLL caused an exception in the DLL.
Make sure that you pass all the necessary parameters to the DLL and that the parameters are of the proper type." (в моем переводе - ошибка в типе параметров переданных в dll)... У тебя слишком вольный перевод. Написано примерно следующее: "Параметры переданные в DLL вызвали исключение, убедитесь что передали все параметры и они имеют соответствующий тип"

1. Для dword использовать Integer, но не как ни double
2. PersonData и Photo корректно заполнены до вызова DLL?
...
Рейтинг: 0 / 0
declare - dll
    #35020076
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВБЧто касается типа pointer, то тут надо смотреть. Изли изображение хранится в распределённой памяти, то указатель на эту память так же передаётся с типом Long (или Integer).
В фоксе сохранить в память изображения я смогу только в переменной "строка".
хорошо, если указатель декларировать как строка, то как будет вызыватся такая функция?
Код: plaintext
1.
2.
3.
DECLARE INTEGER AddPerson IN SW_IM.dll STRING PersonData,  INTEGER Photo, INTEGER PhotoSize, SHORT @ Person_descr_error

ret= AddPerson (TPerson, @m_photo, len(m_photo), @ descr_error)
...
Рейтинг: 0 / 0
declare - dll
    #35020199
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T1. Для dword использовать Integer, но не как ни double
да. действительно. согласен.
Dima T2. PersonData и Photo корректно заполнены до вызова DLL?
считаю что все правильно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
DECLARE INTEGER AddPerson IN SW_IM.dll STRING PersonData, STRING @ Photo, INTEGER PhotoSize, SHORT @ Person_descr_error
*TPerson = record 
*	Person_id: integer; 
*	FirstName: pchar;
*	LastName: pchar; 
*	MiddleName: pchar; 
*	BirthDate: TSystemTime;
*	TableNum: integer; 
*	JobTitle: pchar; 
*	Organization: pchar;
*	Subdivision: pchar; 
*	WorkPlace: pchar;
*	DocType: pchar;
*	DocSeries: pchar;
*	DocNum: pchar;
*	DocIssuedOrg: pchar; 
*	DocIssuedDate: pchar;
*	Note: pchar; 
*end
TPerson=WordToStr( 1 )+alltrim(fam)+chr( 0 )+alltrim(im)+chr( 0 )+alltrim(otch)+chr( 0 )+ ;
	TSystemTime(dro)+WordToStr(tabn)+chr( 0 )+"TMÇ"+chr( 0 )+str(cex, 3 )+chr( 0 )+str(YCH, 2 )+chr( 0 )+ ;
	"паспорт"+chr( 0 )+alltrim(PSER)+chr( 0 )+alltrim(PNOMER)+chr( 0 )+alltrim(PKEMV)+chr( 0 )+ ;
	dtoc(PDATAV)+chr( 0 )+chr( 0 )
descr_error= 0 
ret= AddPerson (TPerson,  0 ,  0 , @ descr_error)
...
Рейтинг: 0 / 0
declare - dll
    #35020244
А PChar - это, случаем, не указатель на строку? Почему в него пишется строка? Record что, переменной длины?
...
Рейтинг: 0 / 0
declare - dll
    #35020276
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходящий.А PChar - это, случаем, не указатель на строку?
такая мысль тоже закралась ко мне только что :-)
как же мне сформировать такую структуру?
...
Рейтинг: 0 / 0
declare - dll
    #35020364
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В паскале не силен, но тут явно у тебя нестыковка с паскалевским Integer: если ты считаешь что SHORT фокса надо использовать, то почему для Person_descr_error SHORT я для возврата фоксовый INTEGER? Тут просто определить INTEGER или SHORT если в паскале Integer это 16 бит (2 байта), то SHORT, иначе INTEGER

Я бы посоветовал сделать свою DLL с такой же функцией (по параметрам) и
1. Поставить в DLL MessageBox() для проверки что она работать начинает
2. Сохранить полученные параметры в файл и посмотреть что же она реально получает.

Если есть исходники той DLL - то сделай копию проекта и выкинь внутренности.

Убедись в работоспособности этой DLL - вызови ее из дельфи например.

Заполнять из фокса TPerson не самое простое занятие. Тут класс для заполнения структур на VFP с примерами.
Я бы посоветовал сделать в той же DLL (или в отдельной) функцию обертку, которая примет содержимое TPerson отдельными параметрами, соберет в структуру и вызовет AddPerson()
...
Рейтинг: 0 / 0
declare - dll
    #35020440
Вставлять в Record не саму строку, а ее адрес. то есть вместо
Код: plaintext
TPerson=WordToStr( 1 )+alltrim(fam)+chr( 0 )...
написать примерно следующее
Код: plaintext
TPerson=WordToStr( 1 )+WordToStr(@fam)+...
Заметь без всяких chr(0) после фамилии.
...
Рейтинг: 0 / 0
declare - dll
    #35020597
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WordToStr(@fam) не приводит к передаче в WordToStr указателя , а передает туже строку но с возможностью изменения в функции
...
Рейтинг: 0 / 0
declare - dll
    #35020620
ВБ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to АлексейО

Ну, батенька, вы совершенно зря считаете, что у Вас всё правильно.

Фокс не поддерживает структур, поэтому действительно мы вынуждены эмулировать структуру как строку. Но в Вашей структуре сплошняком одни указатели на строки pchar.
Конечно, можно эмулировать и такую структуру, но в этому случае в каждое поле структуры вы должны поместить указатели на строки pchar, а не сами эти строки. Соответственно, выделив для каждой такой строки память (например, API функций GlobalAlloc).
Т.е. распределяете память, вызывая GlobalAlloc и получая указатели на выделенные блоки, потом при помощи фоксовской функции SYS(2600) загоняете туда Ваши строковые данные, и только после этого вызываете Вашу API. Ну и, потом, возвращаете всю распределённую память винде.

А иначе - никак.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / declare - dll
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]