Einzelnen Beitrag anzeigen

s14

Registriert seit: 15. Mai 2003
Ort: München
251 Beiträge
 
Delphi 7 Architect
 
#6

Re: Einem Array of WChar einen String zuweisen

  Alt 10. Dez 2003, 09:20
Vielen Dank für die Antworten!
Ich komme da aber einfach nicht weiter.
Vielleicht ist ja schon bei der Übersetzung aus dem DDK ein Fehler passiert

Hier mal meine Übersetzung der Datei tcpxcv.h:
Delphi-Quellcode:
unit Port;

 // aus dem DDK -> tcpxcv.h

interface

uses winspool, windows;

const
  MAX_PORTNAME_LEN = 63 +1; // port name length
  MAX_NETWORKNAME_LEN = 48 +1; // host name length
  MAX_SNMP_COMMUNITY_STR_LEN = 32 +1; // SNMP Community String Name
  MAX_QUEUENAME_LEN = 32 +1; // lpr print que name
  MAX_IPADDR_STR_LEN = 15 +1; // ip address; string version
  PROTOCOL_RAWTCP_TYPE = 1;
  MAX_DEVICEDESCRIPTION_STR_LEN = 256+1;

type
  _PORT_DATA_1 = record
    sztPortName : Array[0..MAX_PORTNAME_LEN] of WChar;
    dwVersion,
    dwProtocol,
    cbSize,
    dwReserved : Cardinal;
    sztHostAddress : Array[0..MAX_NETWORKNAME_LEN] of WChar;
    sztSNMPCommunity : Array[0..MAX_SNMP_COMMUNITY_STR_LEN] of WChar;
    dwDoubleSpool : Cardinal;
    sztQueue : Array[0..MAX_QUEUENAME_LEN] of WChar;
    sztIPAddress : Array[0..MAX_IPADDR_STR_LEN] of WChar;
    Reserved : Array[0..540] of Byte;
    dwPortNumber,
    dwSNMPEnabled,
    dwSNMPDevIndex : Cardinal;
  end;
  PPortData1 = ^_PORT_DATA_1;
  TPortData1 = _PORT_DATA_1;

  _DELETE_PORT_DATA_1= record
    psztPortName : Array[0..MAX_PORTNAME_LEN] of WChar;
    Reserved : Array[0..98] of Byte;
    dwVersion : Cardinal;
    dwReserved : Cardinal;
  end;
  PDeletePortData1 = ^_DELETE_PORT_DATA_1;
  TDeletePortData1 = _DELETE_PORT_DATA_1;

  _CONFIG_INFO_DATA_1 = record
    Reserved : Array[0..128] of Byte;
    dwVersion : Cardinal;
  end;
  PConfigInfoData = ^_CONFIG_INFO_DATA_1;
  TConfigInfoData = _CONFIG_INFO_DATA_1;


function XcvData(hXcv: Cardinal;
                 pszDataName: LPCWSTR;//PWideChar;
                 pInputData: Pointer;
                 cbInputData: Cardinal;
                 pOutputData: PBYTE;
                 cbOutputData: Cardinal;
                 pcbOutputNeeded: PDWORD;
                 pdwStatus: PDWORD): Boolean; stdcall;

// aus MSDN
{BOOL WINAPI
  XcvData(
    HANDLE  hXcv,
    LPCWSTR  pszDataName,
    PBYTE  pInputData,
    DWORD  cbInputData,
    PBYTE  pOutputData,
    DWORD  cbOutputData,
    PDWORD  pcbOutputNeeded,
    PDWORD  pdwStatus
    );
}

implementation

function XcvData; external winspl name 'XcvDataW';

end.
Der Aufruf sieht dann so aus:
Delphi-Quellcode:
// uses Math, Port
procedure TForm1.Button1Click(Sender: TObject);
var
  hXcv : THandle;
  pDefaults : PPrinterDefaults;
  pInputData : PChar;
  pdwStatus : PDWORD;
  PortData1 : TPortData1;
  sPortName, sHostAddress, sSNMPCommunity, sQueue, sIPAddress : String;
begin
  // ("<ServerName>\\,XcvMonitor <MonitorName>", für Remotezugriff !!
  GetMem(pDefaults, SizeOf(TPrinterDefaults));
  pDefaults.pDatatype := NIL;
  pDefaults.pDevMode := NIL;
  pDefaults.DesiredAccess := SERVER_ACCESS_ADMINISTER;//SERVER_ALL_ACCESS;//PRINTER_ACCESS_ADMINISTER;
  // cltprinter01
  if OpenPrinter(',XcvMonitor Standard TCP/IP Port', hXcv, nil) then begin
    // -- Handle erhalten
    m.Lines.Add('hXcv erhalten -> ' + IntToStr(hXcv));

    // -- Struktur erstellen
    sPortName := 'IP_222.222.222.222';
    sHostAddress := '222.222.222.222';
    sSNMPCommunity := 'public';
    sQueue := '';
    sIPAddress := '222.222.222.222';

    FillChar(PortData1, SizeOf(TPortData1), #0);
    StringToWideChar(sPortName, @PortData1.sztPortName, Min(Length(sPortName) +1, MAX_PORTNAME_LEN));
    PortData1.dwVersion := 1;
    PortData1.dwProtocol := PROTOCOL_RAWTCP_TYPE;
    PortData1.cbSize := SizeOf(TPortData1);
    Portdata1.dwReserved := 0;
    StringToWideChar(sHostAddress, @PortData1.sztHostAddress, Min(Length(sHostAddress) +1, MAX_NETWORKNAME_LEN));
    StringToWideChar(sSNMPCommunity, @PortData1.sztSNMPCommunity, Min(Length(sSNMPCommunity) +1, MAX_SNMP_COMMUNITY_STR_LEN));
    PortData1.dwDoubleSpool := 0;
    StringToWideChar(sQueue, @PortData1.sztQueue, Min(Length(sQueue) +1, MAX_QUEUENAME_LEN));
    StringToWideChar(sIPAddress, @PortData1.sztIPAddress, Min(Length(sIPAddress) +1, MAX_IPADDR_STR_LEN));
    PortData1.dwPortNumber := 9100;
    PortData1.dwSNMPEnabled := 0;
    PortData1.dwSNMPDevIndex := 1;

    New(pdwStatus);
    // !!! dieser Aufruf funktioniert NICHT !!! Rückgabe "Ungültiger Parameter"
    if XcvData(hXcv, // Handle des Monitors
               'L"AddPort"', // Befehl an DLL, DeletePort auch möglich
               @PortData1, // PORT_DATA_1 Struktur
               SizeOf(PortData1), // Größe des Puffers
               nil, 0, nil, // not used
               pdwStatus) then
    begin
      m.Lines.Add('XcvData "AddPort" erfolgreich ausgeführt');

    end else m.Lines.Add('Error XcvData -> ' + SysErrorMessage(GetLastError));

    m.Lines.Add('pdwStatus -> ' + SysErrorMessage(pdwStatus^));
    ClosePrinter(hXcv);
  end else m.Lines.Add('Error OpenPrinter -> ' + SysErrorMessage(GetLastError));

  FreeMem(pDefaults);
end;
OpenPrinter funktioniert noch aber eben der Aufruf der Funktion XcvData nicht

Als Anhang hab ich noch die Headerdatei eingefügt.

Es wäre schön wenn einer einen Fehler finden würde oder auch sonst irgendeinen Hinweis geben kann!!

Gruß
s14
Angehängte Dateien
Dateityp: h tcpxcv.h (2,0 KB, 19x aufgerufen)
  Mit Zitat antworten Zitat