Форум: "Основная";
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];
ВнизКак использовать Сишную dllку? Есть исходник. Нужно её вызывать из Дельфи и получать ответ. В Си я не очень. Подскажите пожалуйтса! Найти похожие ветки
← →
dr.Flex (2002-02-27 22:02) [8]Если это никак не связано с гридами, тогда дело в том что у тебя стек валится, это обычно происходит из за неправильного формата вызова - расс, из за - неправильно передаваемых параметров - двас.
И кстати, CBmove=packed record - не факт что так правильно, обычно выравнивается на границу учетверённого слова, а packed record- это, если мне память не изменяет, на границу байта, так шо могут быть проблемы. Нужно в сишном исходнике поглядеть нету ли там таких словцов #pragma pack 1
далее тип double в разных компиляторах разного размера, это факт точно не помню где есть как но бывает и 10 байт
всякие array использовать в описании параметров это черевато изысканными граблями, лучше объявть поинтер распределить память потом закастить к массиву, тогда будет всё понятно, можно менее понятно - передать @barray. Далее тоже самое нужно сделать и со структурой, var параметры это ненадёжно, просто структуру нужно сделать ^cbmvoe динамической распределить память и передать поинтер.
последне, лучше не передавать ссылки на переменные распределённые в стеке, а именно это тыи делаешь с масивами, структурой и строкой.
Итого вызов на мой взгляд скорее всего должен выглядеть так:
int WINAPI getmove(int b[8][10],int color, double maxtime, char str[255], int *playnow, int info, int unused, struct CBmove *move);
type
TcbBuff = array[8][10] of integer;
PcbBuff = ^TcbBuff;
pInteger = ^integer;
PCBMove = ^CBMove;
function getmvoe(b:pointer; color:integer
maxtime:double{возможно Extended};
str:PChar; playnow:pInteger;
info:integer; unused:integer;
move: PCBMove):integer;stdcall;
//
var
MyMove :PCBMove;
Buff :PcbBuff;
maxtime:double;
str :PChar;
playnow,
info, res
unused,
color :integer;
begin
MyMove:=New(PCBMove);
MyMove^.ismove:=100;//тильду можно не писать, но лучше писать
...
Buff:=New(PcbBuff);
Buff^[0,0]:=100;//тильду можно не писать, но лучше писать
...
Str:=StrAlloc(256);
...
...
...
res:=getmvoe(Buff, color, maxtime, @playnow, info, unused, MyMove);
end;
успехов в трубе :-))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c