|
Вопрос # 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): надо это кому-то
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|