Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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™

min@y™ (статус: Доктор наук), 18 апреля 2012, 17:01 [#1]:

Покажи тело функции внутри DLL (если есть исходник, конечно). Без этого надо быть телепатом, чтобы ответить на твой вопрос.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 18 апреля 2012, 17:02 [#2]:

Наверное для этого надо знать какой формат записи используется внутри dll. Чего гадать-то?

Цитата:

функция не выполнилась и вернула ненулевое значение
Как функция, которая не выполнялась, могла что либо вернуть? Нонсенс!
"Digital Networked Knight"
SOA

SOA (статус: Посетитель), 18 апреля 2012, 23:50 [#3]:

anbaresi:
попробуйте посмотреть тут http://msdn.microsoft.com/en-us/library/ms690965(VS.85).aspx
И возможно тут http://msdn.microsoft.com/en-us/library/ms689681(VS.85).aspx

Если все правильно понимаю в вашем случае речь идет об интерфейсе IFilter, с которым работает ваша dll.
Возможно поможет :-X .
anbaresi

anbaresi (статус: Посетитель), 19 апреля 2012, 11:29 [#4]:

min@y™:
исходника нет, но точно известно, что функции в качестве аргумента требуется ссылка на структуру, в которой два поля (num типа integer задает тип фильтра, data - массив из двух байт определяет параметры фильтрации).
Если в качестве аргумента передать nil (что соответствует тому, что фильтр не используется), то Result=0. Вот я и подумал, что неверно задаю поля, может надо через выделение памяти или еще как. При этом полагая, что требование к структуре и полям в том небольшом описании, что у меня есть, все же верно.
DNK:
подразумеваю, не выполнила полезного, а обработала исключительную ситуацию и вернула код ошибки.
SOA:
спасибо, но это не то.

Да, скорее всего тут нужно быть телепатом,но я не знаю как еще описать ситуацию и что спросить, кроме как о правильности работи с записью, полями и передаче по ссылке.
DNK

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™

min@y™ (статус: Доктор наук), 19 апреля 2012, 13:03 [#6]:

Цитата (anbaresi):

исходника нет, но точно известно, что функции в качестве аргумента требуется ссылка на структуру, в которой два поля (num типа integer задает тип фильтра, data - массив из двух байт определяет параметры фильтрации).

Где это описание? Дай почитать-то!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
anbaresi

anbaresi (статус: Посетитель), 19 апреля 2012, 15:12 [#7]:

DNK:
packed record, это же гениально.
заработало.

20 апреля 2012, 11:22: Статус вопроса изменён на решённый (изменил модератор DNK): надо это кому-то

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:45
Выполнено за 0.03 сек.