Форум: "Начинающим";
Текущий архив: 2011.05.01;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c