Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

record из dll


Тимоха111 ©   (2011-01-22 14:19:00) 

Надо хранить некоторые данные в длл в виде record, как потом получить этот рекорд в главное программе.
в длл:

type
TUser = record
name:char;
last:char;
end;
function getuser:TUser; stdcall;
var
user:Tuser;
begin
user.name := 'Oleg';
user.last := 'Petrov';
REsult := User;
end;


на стороне программы:
объявляю тот же
type
TUser = record
name:char;
last:char;
end;

var user:Tuser;
GetUser:function:Tuser; stdcall;
...
загрузка длл
...
user := GetUser;
..
выгрузка длл

данные получаю из длл и вывожу на форму, но почему то вылезает ошибка, что не так сделал?


Тимоха111   (2011-01-22 17:10:00) [1]

да, в этом то и был косяк((
Всех благодарю за ответы! помогли!


sniknik   (2011-01-22 16:53:00) [2]

> GetCurrentDir
- очень не надежно, с чего взял, что dll лежит в текущей директории?
лучше уж вообще убрать.

> +'\lib\ pp.DLL'
????
> dll:
> library Project1;
переименовываешь после компиляции?


DiamondShark   (2011-01-22 16:34:00) [3]

А отладчик что показывает?


Тимоха111   (2011-01-22 15:47:00) [4]

тогда почему в моем примере в мемо  не добавляется текст?


DiamondShark   (2011-01-22 15:26:00) [5]


> этот код последнее что получилось, ошибки нет,

В ЭТОМ коде ошибки нет.


> но и данные не приходят из длл,

В ЭТОМ коде всё приходит.


> правильно ли я понимаю что чтобы получить строчку из длл
> нужно использовать sharemem?

Чтобы получить AnsiString надо использовать sharemem.
Чтобы получить ShortString не надо использовать sharemem.


Тимоха111   (2011-01-22 15:09:00) [6]

этот код последнее что получилось, ошибки нет, но и данные не приходят из длл, правильно ли я понимаю что чтобы получить строчку из длл нужно использовать sharemem?


DiamondShark   (2011-01-22 15:08:00) [7]


> Тимоха111   (22.01.11 14:59) [7]

Этот код работает.

В какой строке и какая ошибка?


Тимоха111   (2011-01-22 15:08:00) [8]

использовать sharemem?


Тимоха111   (2011-01-22 14:59:00) [9]

main:
unit formMain;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls;

type
 TUser = record
   Name : shortstring;
 end;

 TGetUser = function:TUser; stdcall;

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 LibHandle: THandle;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
GetUser : TGetUser;
begin
 @GetUser := nil;
 LibHandle := LoadLibrary(PChar(GetCurrentDir+'\lib\pp.DLL'));
 if LibHandle >= 32 then begin
   @GetUser := GetProcAddress(LibHandle,'GetUser');
   if @GetUser <> nil then
   begin
     memo1.Lines.Add('name = '+GetUser.Name);
   end;
 end;
 FreeLibrary(LibHandle);
end;

end.

dll:
library Project1;

uses
 SysUtils,
 Classes;
type
 TUser = record
   Name : ShortString;
 end;

{$R *.res}

function GetUser:TUser; stdcall;
var
 User :TUser;
begin
 User.Name := 'Oleg';
 Result := User;
end;

exports
GetUser;

begin
end.


DiamondShark   (2011-01-22 14:53:00) [10]


> в длл:


> name:char;


> user.name := 'Oleg';


> данные получаю из длл

Враньё.
Не получаешь ты данные из длл, потому что код длл даже не скомпилируется.

Либо реальный код (и дословный текст ошибки), либо GTFO.


Тимоха111   (2011-01-22 14:50:00) [11]

widestring?


Тимоха111   (2011-01-22 14:50:00) [12]

или как я понимаю вытащить рекорд из длл впринципе нельзя?


RWolf   (2011-01-22 14:45:00) [13]


> name:char;last:char;



> user.name := 'Oleg';user.last := 'Petrov';

т.е. здесь подразумевается явно не char.


Тимоха111   (2011-01-22 14:30:00) [14]

спасибо, но длл загружается динамически с помощью LoadLibrary


RWolf   (2011-01-22 14:22:00) [15]

function getuser:TUser; stdcall; external 'mylib.dll';


Наверх

Титульная страница Поиск, карта сайта Написать письмо