Главная страница
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.013 c
1-19545
les
2003-03-26 16:15
2003.04.07
Как посмотреть что внутри BPL


1-19548
multik
2003-03-26 19:00
2003.04.07
Привет всем! Проблемы с сохранением рисунка.


1-19589
Кот Джин
2003-03-28 15:18
2003.04.07
Пара вопросиков по RichEdit


1-19648
passage2003
2003-03-25 19:22
2003.04.07
Исполняется долгий процесс обработки


1-19675
Johnmen
2003-03-24 10:45
2003.04.07
OLEAUT.DLL