Thanks iedereen tot dusver, even mijn repliek hier onder.
@Marius2: Ik werk met Delphi XE6. SimpleShareMem zou iets vergelijkbaars moeten doen als ShareMem, maar dan zonder een borlandmm.dl te hoeven meegeven. In theorie moet dat het probleem oplossen, maar dat doet het dus niet.
@Erwin: Ik heb een keer gestoeid met bpl's maken ipv dll's, maar die kreeg ik niet gecompileerd omdat een aantal units die ik nodig had niet in een package mochten zitten. De exacte foutmelding ben ik even kwijt, maar het was wel de reden waarom ik er niet mee verder kan.
@Wok:
Ik doe al eigenlijk zo iets, middels een localize procedure. Zie code hier onder.
@marcov: Gelukkig zit bij mij alles wel in dezelfde Delphi. Ik heb een general unit met een blok globale vars die ik steeds aan de dll's meegeef. Bij types anders als dynamische arrays en dus ook strings gaat het prima, anderzijds gaat het mis.
Onderstaand wat ik er momenteel in heb zitten, wellicht dat jullie nog iets zien wat ik beter anders kan doen? Alvast bedankt!
Declaratie:
Code:
type
TStrObj = record
private
FString : string;
PString : ^string;
FCopyString : string;
PCopyString : ^string;
function FGetString() : string;
procedure FSetString(AString : string);
public
property Val : string read FGetString write FSetString;
procedure Localize();
end;
Implentatie:
Code:
{ TStrObj }
function TStrObj.FGetString: string;
begin
// Eerst zeker weten dat deze bestaan
if PString = nil then
begin
FString := '';
PString := @FString;
FCopyString := '';
PCopyString := @FCopyString;
end;
// Dereferenced value teruggeven.
Result := PString^;
end;
procedure TStrObj.FSetString(AString: string);
var i : Integer;
begin
// Eerst zeker weten dat deze bestaan
if PString = nil then
begin
FString := '';
PString := @FString;
FCopyString := '';
PCopyString := @FCopyString;
end;
PString^ := ''; // Inhoud eerst clearen
// Hier niet rechtstreeks, char is als het goed is niet reference counted.
for i := 1 to Length(AString) do
PString^ := PString^ + AString[i];
end;
procedure TStrObj.Localize;
var i : Integer;
begin
// Deze procedure wordt alleen in de main exe aangeroepen zodat
// alle pointers lokaal zijn.
// Eerst zeker weten dat deze bestaan
if PString = nil then
begin
FString := '';
PString := @FString;
FCopyString := '';
PCopyString := @FCopyString;
end;
PCopyString^ := PString^; // Geen var string voor de scope van deze procedure, geeft AV's.
PString^ := ''; // Inhoud eerst clearen.
// Hier niet rechtstreeks, char is als het goed is niet reference counted.
for i := 1 to Length(PCopyString^) do
PString^ := PString^ + PCopyString^[i];
// Tot aan dit punt geen probleem.
PCopyString^ := ''; // AV hier
end;
Het probleem zal vast al eerder ergens gebeuren, maar het gaat pas echt bij het einde van Localize mis.
Volgorde is:
Localize
Roep DLL aan.
DLL past Val aan.
Localize opnieuw. <- En hier dus de AV
Sluit DLL
Bookmarks