/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Komminukation med C(++) Part 2.
Fra : Ukendt


Dato : 03-01-08 06:48

Denne tråd er inspireret af Michael's 'bøvl' med C libraries.

Jeg har tidligere omtalt et 'fedtemadsprogram' til at teste/illustrere
forhold omkring Strings,Chars,WideStrings,PWidechars osv.

Jeg har kommenteret hver linie så godt jeg kan, og vedlægger unit filen.
Formen består bare af nogle få standard komponenter, så den kan man lave som
man vil.

Meningen er, at hvis man 'stopper' ved den sidste linie:
Label1.Caption := P ;
kan man holde musen over de forskellige variable.
Prøv eksempelvis at holde den over T.W og T.WC, det er 2 repræsentationer af
de samme data.

På et tidspunkt vil jeg nok lave nogle demoer, der afspejler de forskellige
calling conventions.

Her er unit filen:
unit WidetestU;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

(*
Her definerer vi en record, der kan opfattes som enten
101 16 bits tal, eller 101 Widechar's.
Samtidig kan WC 'bruges' som en streng på 100 + terminating 0
*)
tTestRec = PACKED RECORD
CASE Boolean OF
false : ( W : ARRAY [0..100] OF Word );
true : ( WC : ARRAY [0..100] OF Widechar );
END ;

var
Form1: TForm1;
T : tTestRec ;
S : WideString ; // En streng
P : PWidechar ; // En pointer

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
// Vi tester om vi kan lægge en snsistreng direkte over i WideString
S := Edit1.Text ;

// Her udvider vi strengen, så vi er sikre på, at der ikke er 0'er
efterfølgende.
S := S + 'Z';

// Her sætter vi længden ned igen, hvilket kun er længdeangivelsen,
// så de 4 Z'er er intakt i hukommelsen.
SetLength(S,Length(S)-4);

// Her tjekker vi om vi kan lægge en widestring direkte over i ansistreng.
Memo1.Lines.Add(S);

// Her fylder vi bufferen op, så vi er sikre på, der ikke er 9'er i.
Fillchar(T,202,64);

// Her laver vi en rå memoryflytning + lidt ekstra, så vi får afslutningen
med.
Move(S[1],T.W, Length(S)*2 + 10 ) ;

// Her sætter vi korset's tegn i unicode.
T.W[0] := 32*256+32 ;

// Her udnytter vi at Delphi kan opfatte array [0.. som en 0 termnineret
streng
S := T.WC ;

// Her tjekker vi hvad der sker med korset's tegn i VCL'et
Memo1.Lines.Add(S);

// Her sætter vi pointeren P op til at pege på strengen S
P := PWidechar(S);

// Her tjekker vi om vi kan lægge en PWideChar i en ansistregn.
Memo1.Lines.Add(P);

// Her lægger vi en PwideChar over i en Widestring.
S := P ;

// Viser resultatet.
Memo1.Lines.Add(S);

// Samme som før, men vi tjekker lige .Caption
Label1.Caption := P ;
end;

end.

--

Med venlig hilsen/Best regards
Stig Johansen






 
 
Ukendt (05-01-2008)
Kommentar
Fra : Ukendt


Dato : 05-01-08 14:43

"Stig Johansen" <stig_johansen_it_at_hotmail.com> wrote in message
news:477c7490$0$90270$14726298@news.sunsite.dk...
> Denne tråd er inspireret af Michael's 'bøvl' med C libraries.

Nu har jeg lavet et par demofunktioner analogt med Michaels
problemstillinger.
Jeg har dog været lidt doven og brugt 1 og 2 direkte i stedet for
konstanterne.
Demofunktionerne består af et program Flextest samt en tilhørende dll
pflxdrv.
pflxdrv består af en initieringsfunktion samt callback til de 2 funktioner
som Michael har omtalt.
Derudover er der en 'hjælpefunktion' til at triggere callback funktionerne,
da der ikke er nogle eksterne events til det.
Programmet Flextest består af et par labels, der skal illustrere callback
til Display.
For at illustrere Auth kode er der et editfelt, der efter 5 gange bliver
returneret som kode. Ved siden af er der et Memo, der viser at funktionen
kaldes 5 gange.

Jeg har tidligere talt om cdecl ct. stdcall, da jeg _ved_ jeg har brugt det.
MEN man skulle nok have tjekket i stedet for at huske.
Det viser sig, at det var på Linux(Kylix) jeg har brugt det.
Da jeg fandt noget gammel kildekode så jeg {$ifdef linux} osv.
På Windows er det normalt stdcall man bruger, beklager forvirringen.

Jeg har ikke lavet så mange kommentarer, for jeg ved ikke rigtig hvad jeg
skal skrive.

Men her er i hvert fald de relevante programstumper:
dll - filen (pflxdrv.dpr)
************************
library pflxdrv;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
Dialogs,
SysUtils,
Classes;

type
tOfflineAutoCode = function (VAR RetAutCode : PWideChar) : Integer; StdCall
;
tDisplay_Status = procedure (CONST Cstat1: WideString; line : Integer);
StdCall ;

VAR
OfflineAutoCode : tOfflineAutoCode ;
Display_Status : tDisplay_Status ;
Counter : Integer ;
RetAutStatus : Integer ;
ShowAutCode : PWideChar ;
LineBuffer : WideString ;
IsInitialized : Integer ;

procedure flxInitCallback(method_id:Integer; method_ptr:pointer); StdCall ;
begin
CASE method_id OF
1 : OfflineAutoCode := method_ptr ;
2 : Display_Status := method_ptr ;
else end;
IsInitialized := method_id ;
end ;

procedure TestCallback (Method_id : Integer );
begin
CASE Method_Id OF
1: BEGIN
REPEAT
RetAutStatus := OfflineAutoCode (ShowAutCode);
Sleep(1000);
UNTIL RetAutStatus = 1 ;
ShowMessage ('Kode = '+ShowAutCode);
END ;
2 : Display_Status(LineBuffer+'1 1 1 1 1 1 ',1);
3 : Display_Status(LineBuffer+'2 2 2 2 2 2',2);
ELSE END ;
end;

exports flxInitCallback,
TestCallback ;

begin
LineBuffer := 'Dette er linie ';
end.

*************************************************
Unit filen til programmet (FlextestU.pas)
******************************************
unit FlextestU;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TfrmMain = class(TForm)
Label1: TLabel;
Label2: TLabel;
lblDisp1: TLabel;
lblDisp2: TLabel;
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Button4: TButton;
Edit1: TEdit;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
frmMain: TfrmMain;
GlobalRetAutCode : WideString ;
Counter : Integer ;

procedure flxInitCallback(method_id:Integer; method_ptr:pointer); stdcall
;External 'pflxdrv.dll';
procedure TestCallback (Method_id : Integer ); External 'pflxdrv.dll';

implementation

{$R *.dfm}

function OfflineAutoCode (VAR RetAutCode : PWideChar) : Integer; stdcall ;
begin
Result := 0 ;
GlobalRetAutCode := ' ' ; // initier med blanke
Counter := ( Counter + 1 ) MOD 5 ;
IF Counter = 0 THEN BEGIN
GlobalRetAutCode := frmMain.Edit1.Text ; ;
Result := 1 ;
END ;
RetAutCode := PWideChar(GlobalRetAutCode) ;
frmMain.Memo1.Lines.Add('Auth kaldt kode= '+IntToStr(Counter));
frmMain.Memo1.Refresh ;
end;

procedure Display_Status (Cstat1: PWideChar; line : Integer); stdcall ;
BEGIN
Case line of
1:
begin
frmMain.lblDisp1.Caption := Cstat1;
frmMain.lblDisp1.Update;
end;
2:
begin
frmMain.lblDisp2.Caption := Cstat1;
frmMain.lblDisp2.Update;
end;
else end;
END;

procedure TfrmMain.FormShow(Sender: TObject);
begin
Counter := 0 ;
flxInitCallback(1,@OfflineAutoCode);
flxInitCallback(2,@Display_Status);
end;

procedure TfrmMain.Button1Click(Sender: TObject);
begin
TestCallback (1) ;
end;

procedure TfrmMain.Button2Click(Sender: TObject);
begin
TestCallback (2) ;
end;

procedure TfrmMain.Button4Click(Sender: TObject);
begin
TestCallback (3) ;
end;

end.
******************************************
Og den ultragrimme dfm fil (FlextestU.dfm)
Men det jo kun illustration og ikke et kunstværk.
*****************************************
object frmMain: TfrmMain
Left = 192
Top = 107
Width = 696
Height = 480
Caption = 'frmMain'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 136
Top = 40
Width = 28
Height = 13
Caption = 'Linie1'
end
object Label2: TLabel
Left = 136
Top = 56
Width = 28
Height = 13
Caption = 'Linie2'
end
object lblDisp1: TLabel
Left = 184
Top = 40
Width = 37
Height = 13
Caption = 'lblDisp1'
end
object lblDisp2: TLabel
Left = 184
Top = 56
Width = 37
Height = 13
Caption = 'lblDisp2'
end
object Button1: TButton
Left = 256
Top = 168
Width = 75
Height = 25
Caption = 'Kald Auth'
TabOrder = 0
OnClick = Button1Click
end
object Button2: TButton
Left = 48
Top = 32
Width = 75
Height = 25
Caption = 'Kald disp linie 1'
TabOrder = 1
OnClick = Button2Click
end
object Memo1: TMemo
Left = 64
Top = 136
Width = 185
Height = 89
Lines.Strings = (
'Memo1')
TabOrder = 2
end
object Button4: TButton
Left = 48
Top = 72
Width = 75
Height = 25
Caption = 'Kald disp linie 2'
TabOrder = 3
OnClick = Button4Click
end
object Edit1: TEdit
Left = 256
Top = 144
Width = 121
Height = 21
TabOrder = 4
Text = '123456'
end
end


--
Med venlig hilsen/Best regards
Stig Johansen




Michael Vilhelmsen (08-01-2008)
Kommentar
Fra : Michael Vilhelmsen


Dato : 08-01-08 08:54

Hej Stig.

Jeg får lige kigget på det hele her i løbet af denne uge - Skal lige have et par temmelig presserende opgaver overstået.

Men ellers jeg vil jeg allerede på forhånd sige mange tak for hjælpen.
En hel del ting er blevet mig meget mere klart - Så noget godt er der da kommet ud af det hele

Michael

--

Best Regards / Venlig hilsen
Michael Vilhelmsen
This is an automatic signature of MesNews.
Site : http://www.mesnews.net



Stig Johansen (09-01-2008)
Kommentar
Fra : Stig Johansen


Dato : 09-01-08 04:11

Michael Vilhelmsen wrote:

> Hej Stig.
> Men ellers jeg vil jeg allerede på forhånd sige mange tak for hjælpen.
> En hel del ting er blevet mig meget mere klart - Så noget godt er der da
> kommet ud af det hele

Det lyder godt.
Jeg har ikke kommenteret så meget i de 2 programmer, men skriv endelig hvis
der er noget, der skal uddybes.

Og det gælder naturligvis alle i gruppen.

--
Med venlig hilsen
Stig Johansen

Søg
Reklame
Statistik
Spørgsmål : 177414
Tips : 31962
Nyheder : 719565
Indlæg : 6407846
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste