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

Вниз

DLL. Проблемы с строковыми типами.   Найти похожие ветки 

 
Step[B.M.] ©   (2003-03-23 03:26) [0]

DLL Как правилько создать функцию, которая бы корректно возвращала запись из нескольких строк PChar.
В моем случае иногда функция возвращает неверные данные в конце строки.
String не использую.


 
panov ©   (2003-03-23 11:05) [1]

Приведи код функции...


 
Anatoly Podgoretsky ©   (2003-03-23 11:13) [2]

К тебя явно ошибка в функции.


 
Step[B.M.] ©   (2003-03-23 19:16) [3]

модуль формы
uses PenniesInt;
****
procedure TMainForm.Button1Click(Sender: TObject);
var
CoinsRec: TCoinsRec;
TotPennies: PChar;
begin
TotPennies := PenniesToCoins(PChar(Edit1.Text), @CoinsRec);
with CoinsRec do begin
Label1.Caption := out1;
Label2.Caption := out2;
end
end;

модуль интерфейса
unit PenniesInt;
interface
type
PCoinsRec = ^TCoinsRec;
TCoinsRec = record
out1,
out2: PChar;
end;
{$IFNDEF PENNIESLIB}
function PenniesToCoins(TotPennies: PChar; CoinsRec: PCoinsRec): PChar; StdCall;
{$ENDIF}
implementation
{$IFNDEF PENNIESLIB}
function PenniesToCoins; external "PENNIESLIB.DLL" name "PenniesToCoins";
{$ENDIF}
end.

DLL
library PenniesLib;
{$DEFINE PENNIESLIB}
uses
SysUtils,
Classes,
PenniesInt;

function PenniesToCoins(TotPennies: PChar; CoinsRec: PCoinsRec): PChar; StdCall;
var work1, work2, all:string;
begin
// переводим Pchar > String
all:=StrPas(TotPennies);
// работаем с строками
work1:=all+"111";
work2:=all+"222";

// переводим String > Pchar
with CoinsRec^ do begin
out1 := Pchar(work1);
out2 := Pchar(work2);
end;
Result := Pchar(TotPennies);

end;
exports
PenniesToCoins;
end.



 
jack128 ©   (2003-03-23 20:09) [4]

work1 и work2 - локальные переменные и после выхода из функции они уничтожаются, поэтому и мусор...


 
Step[B.M.] ©   (2003-03-25 01:35) [5]

Шорошо, а допустим я поключу к DLL DataModule:

library PenniesLib;
{$DEFINE PENNIESLIB}
uses
SysUtils,
Classes,
PenniesInt, Forms,
UDM in "UDM.pas" {DM: TDataModule};

function PenniesToCoins(TotPennies: PChar; CoinsRec: PCoinsRec): PChar; StdCall;
var all:string;
begin
Application.CreateForm(TDM, DM);
Application.Run;

// переводим Pchar > String
all:=StrPas(TotPennies);

// переводим String > Pchar
with CoinsRec^ do begin
out1 := Pchar(DM.Table1Name.AsString);
out2 := Pchar(DM.Table1Capital.AsString);
end;
Result := Pchar(TotPennies);

end;
exports PenniesToCoins;
end.

А? Как таково?


 
chdv   (2003-03-25 12:36) [6]

uses ShareMem


 
REA ©   (2003-03-25 14:10) [7]

>Application.Run; - а это то зачем?

Объяви просто строки глобально в DLL.
Позсле выхода из DLL сразу копируй в свои переменные, чтобы не затереть следующим вызовом.



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

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

Наверх




Память: 0.48 MB
Время: 0.012 c
14-19808
X-Man
2003-03-15 18:53
2003.04.07
Помогите сеть настроить!!!


4-19934
Yttrium
2003-02-06 01:38
2003.04.07
Перетаскиваю из экзешника форму(модальный диалог) в дэлэлэ.


14-19829
MPS87
2003-03-18 11:10
2003.04.07
Что надо сделать чтобы быть настоящим программером?


1-19537
Minog
2003-03-26 13:11
2003.04.07
перегрузка


14-19800
Игорь Досужев
2003-03-19 17:18
2003.04.07
Как использовать