| 
| 
 | Вопрос # 6 087/ вопрос решён / | 
 |  Здравствуйте!
 type
Tfilter = record
 num:=integer;
 data: array [0..1] of byte;
 end;
...
 
var
Filter: Tfilter;
function Filtering(Filter: Pointer): integer;stdcall;external 'filter.dll';
 
...
 
// устанавливаю параметры параметры фильтрации
Filter.Num:=1;
Filter.Data[0]:=$31;
Filter.Data[1]:=$32;
 
...
 
Result:=Filtering(@Filter); Получаю Result=160, т.е. функция не выполнилась и вернула ненулевое значение. SysErrorMessage говорит, что 160 это неверный аргумент функции.
 Вопрос, как грамотно объявить запись, заполнить ее поля и передать ссылку на нее в функцию из dll (полагаем, что dll-ка корректна, количество и типы полей описаны правильно), и только я делаю что-то не так.
 
|  |   Вопрос задал: anbaresi (статус: Посетитель)Вопрос отправлен: 18 апреля 2012, 16:47
 Состояние вопроса: решён, ответов: 1.
 |  Ответ #1. Отвечает эксперт: DNK Здравствуйте, anbaresi!Integer - понятие растяжимое и в разных случаях может иметь разный размер. Надо выянить чем компилилась dll. Кроме того, для оптимизации взаимодействия памяти и процессора, Delphi добавляет выравнивающие данные в структуры. В структуры, где надо это выравнивание отключить, добавляют ключевое слово packed.
 
|  | Ответ отправил: DNK (статус: Студент)Время отправки: 19 апреля 2012, 15:30
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 7; последнее сообщение — 19 апреля 2012, 15:12; участников в обсуждении: 4. 
|   | min@y™ (статус: Доктор наук), 18 апреля 2012, 17:01 [#1]:Покажи тело функции внутри DLL (если есть исходник, конечно). Без этого надо быть телепатом, чтобы ответить на твой вопрос. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | DNK (статус: Студент), 18 апреля 2012, 17:02 [#2]:Наверное для этого надо знать какой формат записи используется внутри dll. Чего гадать-то? 
 
 Цитата:  функция не выполнилась и вернула ненулевое значениеКак функция, которая не выполнялась, могла что либо вернуть? Нонсенс! "Digital Networked Knight" |  
|   | anbaresi (статус: Посетитель), 19 апреля 2012, 11:29 [#4]:min@y™: исходника нет, но точно известно, что функции в качестве аргумента требуется ссылка на структуру, в которой два поля (num типа integer задает тип фильтра, data - массив из двух байт определяет параметры фильтрации).
 Если в качестве аргумента передать nil (что соответствует тому, что фильтр не используется), то Result=0. Вот я и подумал, что неверно задаю поля, может надо через выделение памяти или еще как. При этом полагая, что требование к структуре и полям в том небольшом описании, что у меня есть, все же верно.
 DNK:
 подразумеваю, не выполнила полезного, а обработала исключительную ситуацию и вернула код ошибки.
 SOA:
 спасибо, но это не то.
 
 Да, скорее всего тут нужно быть телепатом,но я не знаю как еще описать ситуацию и что спросить, кроме как о правильности работи с записью, полями и передаче по ссылке.
 |  
|   | DNK (статус: Студент), 19 апреля 2012, 12:25 [#5]:Integer - понятие растяжимое и в разных случаях может иметь разный размер. Надо выянить чем компилилась dll. Кроме того, для оптимизации взаимодействия памяти и процессора, Delphi добавляет выравнивающие данные в структуры. В структуры, где надо это выравнивание отключить, добавляют ключевое слово packed. 
 
 Цитата: type
Tfilter = record
 num:=integer;
 data: array [0..1] of byte;
 end;Это точно скомпилилось? По моему тут знак "=" лишний.
 "Digital Networked Knight" |  
|   | min@y™ (статус: Доктор наук), 19 апреля 2012, 13:03 [#6]: Цитата (anbaresi): исходника нет, но точно известно, что функции в качестве аргумента требуется ссылка на структуру, в которой два поля (num типа integer задает тип фильтра, data - массив из двух байт определяет параметры фильтрации). Где это описание? Дай почитать-то!
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | anbaresi (статус: Посетитель), 19 апреля 2012, 15:12 [#7]:DNK: packed record, это же гениально.
 заработало.
 |  20 апреля 2012, 11:22: Статус вопроса изменён на решённый (изменил модератор DNK): надо это кому-то Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |