unit Stringtest;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
PBookmarkInfo = ^TBookmarkInfo;
TBookmarkInfo =
Record
RecordID : Integer;
BookmarkStr :
String;
end;
PRecordInfo = ^TRecordInfo;
TRecordInfo =
record
RecordIDStr:
String;
//Alternativ wenn Recno nicht unterstützt wird.
RecordID: Pointer;
BookmarkStr:
String;
//Alternativ wenn Recno nicht unterstützt wird.
Bookmark: Pointer;
end;
TGetString =
Function :
String;
TTestform =
class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
Const Datasize :integer = 100;
//Einfach mal so als ersatz für GetDatasize
var
Testform: TTestform;
Buffer : Pointer;
GetString : TGetString;
lib:cardinal;
implementation
{$R *.dfm}
procedure TTestform.Button1Click(Sender: TObject);
Var testwert :
string;
begin
testwert := #1#2#3#4#5#6;
// Das hier geht nicht wenn auch eine DLL geladen
// wird und sharemem aktiv ist
getmem(Buffer,Datasize + sizeof(TRecordInfo));
Fillchar(Buffer^,Datasize + sizeof(TRecordInfo), #0);
With PRecordInfo(Pointer(integer(Buffer) + Datasize))^
do
begin
GetMem(Bookmark , sizeof(TBookmarkInfo) );
PBookmarkInfo(bookmark)^.BookmarkStr := testwert;
//<---hier passiert eine
// Zugriffsverletzung,
// allerdings nur wenn
// eine DLL geladen ist
// und Sharemem aktiv ist;
end;
end;
procedure TTestform.FormCreate(Sender: TObject);
begin
lib := Loadlibrary('
Stringtestdll');
// Ohne den Code gehts
end;
procedure TTestform.FormDestroy(Sender: TObject);
begin
FreeLibrary(lib);
// Ohne den Code gehts
end;
end.