AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Cpp > Pas

Ein Thema von Nils_13 · begonnen am 28. Mär 2008 · letzter Beitrag vom 28. Mär 2008
Antwort Antwort
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#1

Cpp > Pas

  Alt 28. Mär 2008, 17:59
Hi,

ich muss einen Cpp-Code übersetzen und habe Probleme mit den gegebenen Typen.
Extreme Probleme macht mir die Übersetzung von einem LPVOID und CHAR_INFO. Was ich ebensowenig herausfinden konnte ist, was ein &... bedeutet. Ich wusste einfach nicht, was ich da Google fragen sollte. Ich habe im unteren Code (Pascal) die problematischen Zeilen markiert und die Fehlermeldung dazugeschrieben. Hier die beiden Codes:
Code:
#include <windows.h>
#include <stdio.h>
 
VOID main(void)

    HANDLE hStdout, hNewScreenBuffer;
    SMALL_RECT srctReadRect;
    SMALL_RECT srctWriteRect;
    CHAR_INFO chiBuffer[160]; // [2][80];
    COORD coordBufSize;
    COORD coordBufCoord;
    BOOL fSuccess;
 
    // Get a handle to the STDOUT screen buffer to copy from and
    // create a new screen buffer to copy to.
 
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    hNewScreenBuffer = CreateConsoleScreenBuffer( 
       GENERIC_READ |           // read/write access
       GENERIC_WRITE,
       0,                      // not shared
       NULL,                   // default security attributes
       CONSOLE_TEXTMODE_BUFFER, // must be TEXTMODE
       NULL);                  // reserved; must be NULL
    if (hStdout == INVALID_HANDLE_VALUE || 
            hNewScreenBuffer == INVALID_HANDLE_VALUE)
    {
        printf("CreateConsoleScreenBuffer (%d)\n", GetLastError());
        return;
    }
 
    // Make the new screen buffer the active screen buffer.
 
    if (! SetConsoleActiveScreenBuffer(hNewScreenBuffer) )
    {
        printf("SetConsoleActiveScreenBuffer (%d)\n",
            GetLastError());
        return;
    }
 
    // Set the source rectangle.
 
    srctReadRect.Top = 0;   // top left: row 0, col 0 
    srctReadRect.Left = 0;
    srctReadRect.Bottom = 1; // bot. right: row 1, col 79 
    srctReadRect.Right = 79;
 
    // The temporary buffer size is 2 rows x 80 columns.
 
    coordBufSize.Y = 2;
    coordBufSize.X = 80;
 
    // The top left destination cell of the temporary buffer is
    // row 0, col 0.
 
    coordBufCoord.X = 0;
    coordBufCoord.Y = 0;
 
    // Copy the block from the screen buffer to the temp. buffer.
 
    fSuccess = ReadConsoleOutput( 
       hStdout,       // screen buffer to read from
       chiBuffer,     // buffer to copy into
       coordBufSize,  // col-row size of chiBuffer
       coordBufCoord, // top left dest. cell in chiBuffer
       &srctReadRect); // screen buffer source rectangle
    if (! fSuccess)
    {
        printf("ReadConsoleOutput (%d)\n", GetLastError());
        return;
    }
 
    // Set the destination rectangle.
 
    srctWriteRect.Top = 10;   // top lt: row 10, col 0 
    srctWriteRect.Left = 0;
    srctWriteRect.Bottom = 11; // bot. rt: row 11, col 79 
    srctWriteRect.Right = 79;
 
    // Copy from the temporary buffer to the new screen buffer.
 
    fSuccess = WriteConsoleOutput( 
        hNewScreenBuffer, // screen buffer to write to
        chiBuffer,       // buffer to copy from
        coordBufSize,    // col-row size of chiBuffer
        coordBufCoord,   // top left src cell in chiBuffer
        &srctWriteRect); // dest. screen buffer rectangle
    if (! fSuccess)
    {
        printf("WriteConsoleOutput (%d)\n", GetLastError());
        return;
    }
    Sleep(5000);
 
    // Restore the original active screen buffer.
 
    if (! SetConsoleActiveScreenBuffer(hStdout))
    {
        printf("SetConsoleActiveScreenBuffer (%d)\n",
            GetLastError());
        return;
    }
}
Nützliches:
Code:
HANDLE WINAPI CreateConsoleScreenBuffer(
  __in       DWORD dwDesiredAccess,
  __in       DWORD dwShareMode,
  __in_opt   const SECURITY_ATTRIBUTES* lpSecurityAttributes,
  __in       DWORD dwFlags,
  __reserved LPVOID lpScreenBufferData
);
Delphi-Quellcode:
procedure TfrmMain.Button1Click(Sender: TObject);
var hStdout, hNewScreenBuffer : THandle;
    srctReadRect, srctWriteRect : TRect;
    coordBufSize, coordBufCoord : TPoint;
    fSuccess : Boolean;
    CHAR_INFO chiBuffer[160]; // [2][80]; <--
begin
  hStdout := GetStdHandle(STD_OUTPUT_HANDLE);
  hNewScreenBuffer := CreateConsoleScreenBuffer(GENERIC_READ, GENERIC_WRITE, nil, 0, CONSOLE_TEXTMODE_BUFFER, 0); <-- [Fehler] Unit1.pas(34): Inkompatible Typen: 'Integer' und 'Pointer' >>> siehe "Nützliches"

  if (hStdout = INVALID_HANDLE_VALUE) or (hNewScreenBuffer = INVALID_HANDLE_VALUE) then
    raise Exception.Create('CreateConsoleScreenBuffer: '+IntToStr(GetLastError));

  if not SetConsoleActiveScreenBuffer(hNewScreenBuffer) then
    raise Exception.Create('SetConsoleActiveScreenBuffer: '+IntToStr(GetLastError));

  srctReadRect.Top := 0; // top left: row 0, col 0
  srctReadRect.Left := 0;
  srctReadRect.Bottom := 1; // bottom right: row 1, col 79
  srctReadRect.Right := 79;
  // The temporary buffer size is 2 rows x 80 columns
  coordBufSize.Y := 2;
  coordBufSize.X := 80;
  // The top left destination cell of the temporary buffer is
  // row 0, col 0.
  coordBufCoord.X := 0;
  coordBufCoord.Y := 0;

  // Copy the block from the screen buffer to the temp. buffer.
  fSuccess := ReadConsoleOutput(hStdout, chiBuffer, coordBufSize, coordBufCoord, ^srctReadRect); <-- hierfür müsste ich CHAR_INFO übersetzen können, abgesehen davon könnte es noch mehr Ärger in dieser Zeile geben
  if not fSuccess then
    raise Exception.Create('ReadConsoleOutput: '+IntToStr(GetLastError));

  // Set the destination rectangle.
  srctWriteRect.Top := 10; // top lt: row 10, col 0
  srctWriteRect.Left := 0;
  srctWriteRect.Bottom := 11; // bot. rt: row 11, col 79
  srctWriteRect.Right := 79;

  // Copy from the temporary buffer to the new screen buffer.
  fSuccess := WriteConsoleOutput(hNewScreenBuffer, chiBuffer, coordBufSize, coordBufCoord, ^srctWriteRect); <-- hierfür müsste ich CHAR_INFO übersetzen können, abgesehen davon könnte es noch mehr Ärger in dieser Zeile geben
  if not fSuccess then
    raise Exception.Create('WriteConsoleOutput: '+IntToStr(GetLastError));
  Sleep(5000); // Nötig ????

  // Restore the original active screen buffer.
  if not SetConsoleActiveScreenBuffer(hStdout)
    raise Exception.Create('SetConsoleActiveScreenBuffer: '+IntToStr(GetLastError));
end;
  Mit Zitat antworten Zitat
Benutzerbild von bigg
bigg

Registriert seit: 1. Jul 2007
155 Beiträge
 
#2

Re: Cpp > Pas

  Alt 28. Mär 2008, 18:05
Das '&' in C ist das @ in Pascal.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: Cpp > Pas

  Alt 28. Mär 2008, 18:17
CHAR_INFO ist in Windows.pas deklariert. Du kannst dabei auch den Alias TCharInfo nutzen.

Integer=0 => Pointer=nil

*srctReadRect ist bei Delphi srctReadRect^ (das Dächen ist hinten und nicht wie bei C/C++ vorne)


Zitat:
Sleep(5000); // Nötig ????
Das kommt darauf an, ob du es brauchst. Im C Programm wird es benutzt, damit das Programm beim Debuggen nicht sofort beendet wird.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

Re: Cpp > Pas

  Alt 28. Mär 2008, 18:19
Zitat:
GetStdHandle(STD_OUTPUT_HANDLE);
Hat deine Anwendung denn auch ein Konsolenfenster?
  Mit Zitat antworten Zitat
wido

Registriert seit: 2. Jan 2006
122 Beiträge
 
#5

Re: Cpp > Pas

  Alt 28. Mär 2008, 18:21
Ahja, sollst ja auch was lernen bei:

Code:
CHAR_INFO chiBuffer[160]; // [2][80]; <--
Ist ein einfaches Array aus CHAR_INFO. Die Übersetzung lautet entsprechend einfach:

chiBuffer : array[0..159] of CHAR_INFO;
Code:
hNewScreenBuffer := CreateConsoleScreenBuffer(GENERIC_READ, GENERIC_WRITE, nil, 0, CONSOLE_TEXTMODE_BUFFER, 0); <-- [Fehler] Unit1.pas(34): Inkompatible Typen: 'Integer' und 'Pointer' >>> siehe "Nützliches"
Schau im Original Code. Da steht GENERIC_READ | GENERIC_WRITE und nicht GENERIC_READ, GENERIC_WRITE. | ist in C die Bitweise or Verknüpfung, entsprechend wird daraus:

hNewScreenBuffer := CreateConsoleScreenBuffer(GENERIC_READ or GENERIC_WRITE, 0, nil, CONSOLE_TEXTMODE_BUFFER, nil); Auf die anderen Fehler wurdest ja bereits hingewiesen. Entsprechend hier mal das komplette Machwerk:

Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses
  sysutils, windows;

var hStdout, hNewScreenBuffer : THandle;
    srctReadRect, srctWriteRect : _SMALL_RECT;
    coordBufSize, coordBufCoord : _COORD;
    fSuccess : Boolean;
    chiBuffer : array[0..159] of CHAR_INFO; // [2][80]; <--
begin
  hStdout := GetStdHandle(STD_OUTPUT_HANDLE);
  hNewScreenBuffer := CreateConsoleScreenBuffer(GENERIC_READ or GENERIC_WRITE, 0, nil, CONSOLE_TEXTMODE_BUFFER, nil);

  if (hStdout = INVALID_HANDLE_VALUE) or (hNewScreenBuffer = INVALID_HANDLE_VALUE) then
    raise Exception.Create('CreateConsoleScreenBuffer: '+IntToStr(GetLastError));

  if not SetConsoleActiveScreenBuffer(hNewScreenBuffer) then
    raise Exception.Create('SetConsoleActiveScreenBuffer: '+IntToStr(GetLastError));

  srctReadRect.Top := 0; // top left: row 0, col 0
  srctReadRect.Left := 0;
  srctReadRect.Bottom := 1; // bottom right: row 1, col 79
  srctReadRect.Right := 79;
  // The temporary buffer size is 2 rows x 80 columns
  coordBufSize.Y := 2;
  coordBufSize.X := 80;
  // The top left destination cell of the temporary buffer is
  // row 0, col 0.
  coordBufCoord.X := 0;
  coordBufCoord.Y := 0;

  // Copy the block from the screen buffer to the temp. buffer.
  fSuccess := ReadConsoleOutput(hStdout, @chiBuffer[0], coordBufSize, coordBufCoord, srctReadRect);
  if not fSuccess then
    raise Exception.Create('ReadConsoleOutput: '+IntToStr(GetLastError));

  // Set the destination rectangle.
  srctWriteRect.Top := 10; // top lt: row 10, col 0
  srctWriteRect.Left := 0;
  srctWriteRect.Bottom := 11; // bot. rt: row 11, col 79
  srctWriteRect.Right := 79;

  // Copy from the temporary buffer to the new screen buffer.
  fSuccess := WriteConsoleOutput(hNewScreenBuffer, @chiBuffer[0], coordBufSize, coordBufCoord, srctWriteRect);
  if not fSuccess then
    raise Exception.Create('WriteConsoleOutput: '+IntToStr(GetLastError));
  Sleep(5000); // Nötig ????

  // Restore the original active screen buffer.
  if not SetConsoleActiveScreenBuffer(hStdout) then
    raise Exception.Create('SetConsoleActiveScreenBuffer: '+IntToStr(GetLastError));
  readln;
end.
Compiled, macht aber gar nichts. Was sollte denn passieren? Hab keine Lust mich durch die API Dokumentation zu wühlen.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

Re: Cpp > Pas

  Alt 28. Mär 2008, 18:32
Zitat von wido:
Was sollte denn passieren?
http://msdn.microsoft.com/library/de...attributes.asp
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#7

Re: Cpp > Pas

  Alt 28. Mär 2008, 18:34
Zitat von jbg:
Zitat:
GetStdHandle(STD_OUTPUT_HANDLE);
Hat deine Anwendung denn auch ein Konsolenfenster?
Nein. Dann geht das so also nicht. Hast du irgendeine Idee, wie man dennoch an die Ausgabe rankommen könnte ? Mein Ziel ist es ja, ein Programm wie TurboPascal in ein Fenster umzuleiten.
@wido: Danke, ich hätte vieles noch von früher (hatte mal etwas mit Cpp zu tun) wissen müssen, aber einiges geht dann doch wieder verloren.

An alle: Wir müssen nun aufpassen, dass wir das andere Thema nicht mit diesem vermischen. Deshalb wäre mein Vorschlag, dass wir nun falls es nichts mit der Übersetzung zu tun hat im anderen Thread weitermachen. Sonst wird das zu unübersichtlich.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#8

Re: Cpp > Pas

  Alt 28. Mär 2008, 18:44
Zitat von Nils_13:
Code:
Sleep(5000); // Nötig ????
Delphi-Quellcode:
program STDINOUT_DMO;

uses
  Windows,
  Messages,
  SysUtils;

procedure Main;
var
  hStdout, hNewScreenBuffer: THANDLE;
  srctReadRect: TSMALLRECT;
  srctWriteRect: TSMALLRECT;
  chiBuffer: array [0..160] of TCHARINFO; // [2]*[80];
  coordBufSize: TCOORD;
  coordBufCoord: TCOORD;
  fSuccess: BOOL;
begin
    // Get a handle to the STDOUT screen buffer to copy from and
    // create a new screen buffer to copy to.

    hStdout := GetStdHandle(STD_OUTPUT_HANDLE);
    hNewScreenBuffer := CreateConsoleScreenBuffer(
       GENERIC_READ or // read/write access
       GENERIC_WRITE,
       0, // not shared
       nil, // default security attributes
       CONSOLE_TEXTMODE_BUFFER, // must be TEXTMODE
       nil); // reserved; must be NULL

    if (hStdout = INVALID_HANDLE_VALUE) or
       (hNewScreenBuffer = INVALID_HANDLE_VALUE) then
    begin
      WriteLn(format('CreateConsoleScreenBuffer (%d)', [GetLastError]));
      exit;
    end;

    // Make the new screen buffer the active screen buffer.

    if not SetConsoleActiveScreenBuffer(hNewScreenBuffer) then
    begin
      WriteLn(format('SetConsoleActiveScreenBuffer (%d)', [GetLastError]));
      exit;
    end;

    // Set the source rectangle.

    srctReadRect.Top := 0; // top left: row 0, col 0
    srctReadRect.Left := 0;
    srctReadRect.Bottom := 1; // bot. right: row 1, col 79
    srctReadRect.Right := 79;

    // The temporary buffer size is 2 rows x 80 columns.

    coordBufSize.Y := 2;
    coordBufSize.X := 80;

    // The top left destination cell of the temporary buffer is
    // row 0, col 0.

    coordBufCoord.X := 0;
    coordBufCoord.Y := 0;

    // Copy the block from the screen buffer to the temp. buffer.

    fSuccess := ReadConsoleOutput(
       hStdout, // screen buffer to read from
       @chiBuffer[0], // buffer to copy into
       coordBufSize, // col-row size of chiBuffer
       coordBufCoord, // top left dest. cell in chiBuffer
       srctReadRect); // screen buffer source rectangle
    if not fSuccess then
    begin
      WriteLn(format('SetConsoleActiveScreenBuffer (%d)', [GetLastError]));
      exit;
    end;

    // Set the destination rectangle.

    srctWriteRect.Top := 10; // top lt: row 10, col 0
    srctWriteRect.Left := 0;
    srctWriteRect.Bottom := 11; // bot. rt: row 11, col 79
    srctWriteRect.Right := 79;

    // Copy from the temporary buffer to the new screen buffer.

    fSuccess := WriteConsoleOutput(
        hNewScreenBuffer, // screen buffer to write to
        @chiBuffer[0], // buffer to copy from
        coordBufSize, // col-row size of chiBuffer
        coordBufCoord, // top left src cell in chiBuffer
        srctWriteRect); // dest. screen buffer rectangle
    if not fSuccess then
    begin
      WriteLn(format('WriteConsoleOutput (%d)', [GetLastError]));
      exit;
    end;
    Sleep(5000); // <--<<

    // Restore the original active screen buffer.

    if not SetConsoleActiveScreenBuffer(hStdout) then
    begin
      WriteLn(format('SetConsoleActiveScreenBuffer (%d)', [GetLastError]));
      exit;
    end;
end;

BEGIN
  AllocConsole;
  Main;
  FreeConsole;
END.
Für das Demo ja. Es dient zur visualisierung des Demos
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz