Работа с DLL (заполнение структуры по переданному указателю в функцию DLL)

|\/|AX
Дата: 10.06.2009 17:54:56
Всем привет.
Сел за делфи вчера. С длл вообще работал как-то раз и просто, чтоб "позырить" как оно.
Возникла задача написать дллку для одной софтины по небольшому описалову для нее.

Сделал, откомпилил. Написал прогу, чтоб проверить работоспособность и что-то не так.
Функция в длл принимает два параметра: значение типа DWORD и указатель на структуру, которую функция и должна заполнить. При первом присваивании переменной структуры вылетает "access violation" и собственно вопрос: в чем может быть причина? Структуре выделяю память перед использованием.

Функция в ДЛЛ:
function GetCardInfo( Card: DWORD; Info: PCardInfo ): Integer; stdcall; export;
var
  S: String[200];
begin
  if Card >= 1 then begin
    Result := 0;
    with Info^ do begin
      Deleted  := 0; // тут вылетает и вообще на любом присваивании
      Discount := 10;
      Bonus    := 5;
      Summa    := 2000000;
      Holder   := 'Иванов Иван Иванович';
      Locked   := 0;
      S := 'Доп информация для карты N ' + IntToStr( Card );
      Move( S[ 1 ], DopInfo, Length( S ));
      Sums[ 2 ] := Card * 10;
      Sums[ 3 ] := Card * 10;
      Sums[ 4 ] := Card * 10;
      Sums[ 5 ] := Card * 10;
    end;
  end else begin
    Result := 1;
  end;
end;

Структура:
  PCardInfo = ^TCardInfo;
  TCardInfo = packed record
    Size       : Word;
    Deleted    : Byte;
    Seize      : Byte;
    StopDate   : Byte;
    Holy       : Byte;
    Manager    : Byte;
    Discount   : Word;
    Summa      : Comp;
    Holder     : Array[0..39] of Char;
    Bonus      : Word;
    Locked     : Byte;
    WhyLock    : Array[0..39] of Char;
    DiscLimit  : Comp;
    Unpay      : DWORD;
    DopInfo    : Array[0..199] of Char;
    Sums       : Array[2..5] of Comp;
  end;

Объявление функции в проге:
function GetCardInfo( Card: DWORD; Info: PCardInfo ): Integer; external 'FarCards.dll';
|\/|AX
Дата: 10.06.2009 17:59:53
вот сообщение об ошибке:
Dim2000
Дата: 10.06.2009 18:09:44

|/|AX пишет:

> function GetCardInfo( Card: DWORD; Info: PCardInfo ): Integer; stdcall; export;

> PCardInfo = ^TCardInfo;

А это зачем?

> Объявление функции в проге:
> function GetCardInfo( Card: DWORD; Info: PCardInfo ): Integer; external 'FarCards.dll';

А тут где stdcall? И зачем он, если использовать DLL из эхотага?

Posted via ActualForum NNTP Server 1.4

|\/|AX
Дата: 10.06.2009 18:22:30
Dim2000

|/|AX пишет:

> function GetCardInfo( Card: DWORD; Info: PCardInfo ): Integer; stdcall; export;

> PCardInfo = ^TCardInfo;

А это зачем?

> Объявление функции в проге:
> function GetCardInfo( Card: DWORD; Info: PCardInfo ): Integer; external 'FarCards.dll';

А тут где stdcall? И зачем он, если использовать DLL из эхотага?


Пост породил еще 2 новых вопроса
1. Разве это существенно? Был пример исходника, я так и оставил
2. И все решилось) похерил. читал доку на каком-то сайте там пример процедуры был. а тут вставил тип возвращаемого результата, а про stdcall забыл
Спасибо!
Gwa
Дата: 10.06.2009 18:28:29
Dim2000

|/|AX пишет:

> function GetCardInfo( Card: DWORD; Info: PCardInfo ): Integer; stdcall; export;

> PCardInfo = ^TCardInfo;

А это зачем?

> Объявление функции в проге:
> function GetCardInfo( Card: DWORD; Info: PCardInfo ): Integer; external 'FarCards.dll';

А тут где stdcall? И зачем он, если использовать DLL из эхотага?


Объявление:
function GetCardInfo( Card: DWORD; var Info: TCardInfo ): Integer; external 'FarCards.dll'; stdcall;

Вызов:
var Card: DWORD;
Info: TCardInfo;
i: integer;

i:=GetCardInfo(Card,Info);
|\/|AX
Дата: 10.06.2009 18:37:02
Gwa
Dim2000

|/|AX пишет:

> function GetCardInfo( Card: DWORD; Info: PCardInfo ): Integer; stdcall; export;

> PCardInfo = ^TCardInfo;

А это зачем?

> Объявление функции в проге:
> function GetCardInfo( Card: DWORD; Info: PCardInfo ): Integer; external 'FarCards.dll';

А тут где stdcall? И зачем он, если использовать DLL из эхотага?


Объявление:
function GetCardInfo( Card: DWORD; var Info: TCardInfo ): Integer; external 'FarCards.dll'; stdcall;

Вызов:
var Card: DWORD;
Info: TCardInfo;
i: integer;

i:=GetCardInfo(Card,Info);


Это конечно хорошо, но если есть документация на длл и там прописано, что второй параметр должен быть указатель на структуру, то наверно и надо передавать указатель ))) иначе как длл потом работать будет.
stdcall все решил и в нем вся причина была. Спасибо еще раз.
Зайцев Фёдор
Дата: 10.06.2009 18:44:40
|\/|AX

Это конечно хорошо, но если есть документация на длл и там прописано, что второй параметр должен быть указатель на структуру, то наверно и надо передавать указатель ))) иначе как длл потом работать будет.

так же будет работать, просто nil будет чуть сложнее передать )
|\/|AX
Дата: 10.06.2009 19:40:08
Зайцев Фёдор
так же будет работать, просто nil будет чуть сложнее передать )


Наверно. Дело в том что длл пишется под готовую систему и передавать она(софтинка) будет именно указатель на структуру и никак иначе. Не я это придумал. Так было решено создателем )
_Vasilisk_
Дата: 10.06.2009 23:22:49
Зайцев Фёдор
так же будет работать, просто nil будет чуть сложнее передать )
А научите как при такой декларации передать nil?
_Vasilisk_
Дата: 10.06.2009 23:24:28
Зайцев Фёдор
так же будет работать, просто nil будет чуть сложнее передать )
А научите как при такой декларации передать nil?