PDA

Visualizza la versione completa : [DELPHI.NET] StrPCopy per .NET


rotteninside
22-11-2005, 14:37
Ciao, ho trovato (grazie Alka) una funzione che mi permette di mandare delle sequenze di escape alla stampante. Il problema che l'esempio che ho io per win 32 e logicamente alcune funzioni non girano con Delphi.net.
in particolare la StrPcopy. Qualcuno sa darmi qualche idea su come sostituirla? Grazie.


type TPrnBuffRec = record
BuffLength : word;
Buffer : Array [0..255] of char;
end

var F : TextFile;
var Str : string;

Procedure PrintLine(s : string);
var Buff : TPrnBuffRec;
TestInt : Integer;
begin
TestInt := PASSTHROUGH;
if Escape(Printer.Handle, QUERYESCSUPPORT, sizeof(TestInt), @TestInt, nil ) > 0 then
begin
Printer.BeginDoc;
s := #27 + 'W1'+ 'A test string ' + #27 + #10 + ' Ciao Ciao';
StrPCopy(Buff.buffer, s);
Buff.BuffLength := StrLen(Buff.buffer);
Escape(Printer.Canvas.Handle, PASSTHROUGH, 0, @Buff, nil);
printer.EndDoc;
end;
end;

alka
22-11-2005, 19:09
Non esiste un'equivalente della funzione che cerchi, ma il problema pi grosso sta nel fatto che le funzioni API da richiamare richiedono una serie di parametri di cui devi fare il "marshalling" poich stai lavorando con .NET.

.NET una piattaforma gestita che utilizza un Garbage Collector: passare dall'ambiente "gestito" all'ambiente nativo, quindi "non gestito", richiede a volte l'uso di classi e metodi per convertire i valori della propria applicazione in quelli attesi dalle funzioni API che si desidera richiamare.

Per ci che devi fare, l'operazione anche molto complessa, e mi risulta ancora oscuro il motivo per cui si crea un'applicazione .NET per richiamare poi funzioni API di Windows: quali vantaggi dovrebbe portare?

Per dare un'idea di quello che comporta la scrittura di codice che "interopera" con le API, riporto il tuo esempio (opportunamente modificato) con le dovute istruzioni aggiuntive:



program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils, Printers, Windows,
System.Text, System.Runtime.InteropServices;

type

[StructLayout(LayoutKind.Sequential)]
TPrnBuffRec = record
BuffLength: Word;
Buffer: array [0..255] of Byte;
end;

procedure PrintLine;
var
Buff: TPrnBuffRec;
TestInt : Integer;
TestIntPtr: IntPtr;
SourcePtr: IntPtr;
e: ASCIIEncoding;
s: string;
begin
s := #27 + 'W1'+ 'A test string ' + #27 + #10 + ' Ciao Ciao';
TestInt := PASSTHROUGH;
Buff.BuffLength := s.Length;
e := ASCIIEncoding.Create;
Buff.Buffer := e.GetBytes(s);
SourcePtr := Marshal.AllocHGlobal(Marshal.SizeOf(Buff));
try
Marshal.StructureToPtr(Buff, SourcePtr, False);
TestIntPtr := Marshal.AllocHGlobal(Marshal.SizeOf(TypeOf(TestInt )));
try
Marshal.WriteInt32(TestIntPtr, TestInt);
if Escape(Printer.Handle, QUERYESCSUPPORT, SizeOf(TestInt), TestIntPtr, IntPtr.Zero) > 0 then
begin
Printer.BeginDoc;
Escape(Printer.Canvas.Handle, PASSTHROUGH, SizeOf(TPrnBuffRec), SourcePtr, IntPtr.Zero);
Printer.EndDoc;
end;
finally
Marshal.FreeHGlobal(TestIntPtr);
end;
finally
Marshal.FreeHGlobal(SourcePtr);
end;
end;

begin
PrintLine;
end.


Questo ci che io chiamo "un bagno di sangue". :)

So cosa mi stai per dire, che devi seguire le specifiche che ti sono state date.

Beh, direi che puoi buttarle via o rispedirle al mittente in quanto solo un pazzo proseguirebbe su questa strada.

Una fatica del genere per stampare una semplice stringa su una stampante mi sembra davvero eccessiva, oltre al fatto che passi continuamente da .NET a Win32 e viceversa...sarei proprio curioso di leggerle queste "specifiche" per vedere di cosa si tratta...credo siano degne di un romanzo di Asimov! :zizi:

Ciao! :ciauz:

rotteninside
22-11-2005, 20:08
Mah, penso che neppure Asimov sarebbe arrivato a tanto...
In effetti di fantascienza si tratta, appena finito il lavoro (speriamo a breve) ti spiego poi con un pm. Ciao e intanto grazie!

Loading