проблема в следующем:
в с-шном файле объявлена некая структура:
typedef struct{
X:int;
Y:int;
}XYPOS;
и функция, возвращающая результат типа этой структуры:
XYPOS WINAPI SomeFunc();
соответственно при вызове функции из проекта MS Visual CPP
все работает правильно:
void main(){
XYPOS a;
a = SomeFunc();
}
при переводе всего этого на паскаль получилось:
в заголовке:
interface
type XYPOS=record
X:integer;
Y:integer;
end;
function SomeFunc():XYPOS stdcall; external 'mydll.dll' index 0001;
implementation
end.
в приложении при вызове этой функции возникает access violation:
var
a:XYPOS;
begin
a:=SomeFunc; //здесь возникает ошибка
Somefunc; //и даже здесь та же ошибка, т.е. дело не в несовместимости
// размеров переменных
end;
пробовал:
record менять на packed record - тот же результат.
интересно, что если в объявлении функции заменить XYPOS на int64 (размер у них одинаковый), то все работает без ошибок и верхним 32 битам результата присваивается XYPOS.X , а нижним XYPOS.Y.
Просмотр окна CPU показал, что в зависимости от типа возвращаемого результата (record или не record, т.е все простые типы начиная от byte и кончая pointer проходят) выполнение функции идет по двум разным путям:
В одном месте стоит call eal+$00000008 и eal может принимать два разных значения.
Может быть я чио-ио не правильно сделал? Подскажите, пжлста, что можно еще попробовать.
в с-шном файле объявлена некая структура:
typedef struct{
X:int;
Y:int;
}XYPOS;
и функция, возвращающая результат типа этой структуры:
XYPOS WINAPI SomeFunc();
соответственно при вызове функции из проекта MS Visual CPP
все работает правильно:
void main(){
XYPOS a;
a = SomeFunc();
}
при переводе всего этого на паскаль получилось:
в заголовке:
interface
type XYPOS=record
X:integer;
Y:integer;
end;
function SomeFunc():XYPOS stdcall; external 'mydll.dll' index 0001;
implementation
end.
в приложении при вызове этой функции возникает access violation:
var
a:XYPOS;
begin
a:=SomeFunc; //здесь возникает ошибка
Somefunc; //и даже здесь та же ошибка, т.е. дело не в несовместимости
// размеров переменных
end;
пробовал:
record менять на packed record - тот же результат.
интересно, что если в объявлении функции заменить XYPOS на int64 (размер у них одинаковый), то все работает без ошибок и верхним 32 битам результата присваивается XYPOS.X , а нижним XYPOS.Y.
Просмотр окна CPU показал, что в зависимости от типа возвращаемого результата (record или не record, т.е все простые типы начиная от byte и кончая pointer проходят) выполнение функции идет по двум разным путям:
В одном месте стоит call eal+$00000008 и eal может принимать два разных значения.
Может быть я чио-ио не правильно сделал? Подскажите, пжлста, что можно еще попробовать.