Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1296210428
lemparius
2011-01-28 13:27
2011.05.01
Еще одна задача на PageControl


3-1256619451
vovka-x13
2009-10-27 07:57
2011.05.01
Аутентификация в базах данных


4-1248097401
dmitry_12_08_73
2009-07-20 17:43
2011.05.01
Как по Handle окна определить скроллбар это или нет?


2-1296040315
ZV
2011-01-26 14:11
2011.05.01
Как быстро найти нужный массив, и сделать запись в него.


2-1295929098
lemparius
2011-01-25 07:18
2011.05.01
Интересная задача с PageControl





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский