Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.05.01;
Скачать: CL | DM;

Вниз

record из dll   Найти похожие ветки 

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

Надо хранить некоторые данные в длл в виде 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;
..
выгрузка длл

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


 
RWolf ©   (2011-01-22 14:22) [1]

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


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

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


 
RWolf ©   (2011-01-22 14:45) [3]


> name:char;last:char;



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

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


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

widestring?


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

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


 
DiamondShark ©   (2011-01-22 14:53) [6]


> в длл:


> name:char;


> user.name := "Oleg";


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

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

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


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

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 15:08) [8]


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

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

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


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

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


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

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


 
DiamondShark ©   (2011-01-22 15:26) [11]


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

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


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

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


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

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


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

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


 
DiamondShark ©   (2011-01-22 16:34) [13]

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


 
sniknik ©   (2011-01-22 16:53) [14]

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2011.05.01;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
2-1295808004
faiwer
2011-01-23 21:40
2011.05.01
Макрос


15-1295386189
Юрий
2011-01-19 00:29
2011.05.01
С днем рождения ! 19 января 2011 среда


15-1292611123
картман
2010-12-17 21:38
2011.05.01
почему элементы в земной коре встречаются, как правило, залежами?


15-1295136146
Palladin
2011-01-16 03:02
2011.05.01
Java 7, большие числовые константы


3-1257679804
Дмитрий Белькевич
2009-11-08 14:30
2011.05.01
Ососбенность Delphi 2010. Регистрозависимое написание чарсета