![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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';