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