zwrócenie wartości przez parametr funkcji

0

Witam serdecznie,
chciałem zapytać czy są jakieś ograniczenia przy przekazywaniu parametru do funkcji który ma być zmodyfikowany, chodzi o zastosowanie w bibliotekach dll, wyczytałem że przekazywanie łańcuchów tekstowych do funkcji i z funkcji najlepiej opierać o typ PChar, stosując się do tej wytycznej testowo mam taki kod:

function ftest1(var tt:PCar):integer;
begin
 ...
 ..
 .
end;

robiąc tak:

function ftest1(var tt:PCar):integer;
begin
tt:=PChar(s); // gdzie s to s:string;
result:=0;
end;

kompilator zwraca komunikat blędu E2089 Invalid typecast.
Podejście kolejne...

function ftest1(var tt:PCar):integer;
begin
StrPCopy(tt,s) // gdzie s to s:string;
result:=0;
end; 

Tu biblioteka się kompiluje bez problemu, lecz wywołanie tej funkcji kończy się błędem...

Project Project1.exe raised exception class EAccesViolation with message 'Access violation at address 00388D99 in module test.dll. Write of address 0044F143'.

Czy jest jakaś sensowna metoda zwracania parametrów z funkcji w bibliotekach dll, dodam że zwracanie przez nazwę funkcji odpada bo zarezetrwowane jest na kody błędów.
Bardzo proszę o podpowiedź jak rozwiązać ten problem.

0

RTFM!

HELP napisał(a)

Copies an AnsiString (long string) to a null-terminated string.

Unit

SysUtils

Category

string handling routines (null-terminated)

Delphi syntax:

function StrPCopy(Dest: PChar; const Source: string): PChar;

C++ syntax:

extern PACKAGE char * __fastcall StrPCopy(char * Dest, const AnsiString Source);

Description

StrPCopy copies Source into a null-terminated string Dest. It returns a pointer to Dest.

StrPCopy does not perform any length checking.

The destination buffer must have room for at least Length(Source)+1 characters.

Hint: StrAlloc

0
PCar

A nie przypdakiem PChar ?

0

Witam serdecznie,
Misiekd bardzo dziękuję za sensowną podpowiedź, pomogła mi ona rozwiązać problem.

@Patryk27 tak mój błąd ma być PChar.

function ftest1(var tt:PChar):integer;
begin
tt:=StrAlloc(length(s)+1);
StrPCopy(tt,s) // gdzie s to s:string;
result:=0;
end;

0

Witam serdecznie,
przepraszam za odkopanie tematu ale jestem zdania ze nie ma sensu zakładać nowego, jak moje zagadnienie jest podobne...
A więc tak, przykładowa funkcja w bibliotece

function func_c:PChar; cdecl;
var as:ansistring;
begin
  as:=TimeToStr(now);
  Result:=StrAlloc(Length(as)+1);
  StrPCopy(Result,as);
  StrDispose(Result); //???????
end;

Jasne jest użycie StrAlloc i rozsądnie by było zastosować funkcję zwalniającą StrDispose ale w jakim miejscu w kodzie ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1