Announcement

Collapse
No announcement yet.

Aufruf des Modemkonfigurationsdialogs

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Aufruf des Modemkonfigurationsdialogs

    Hallo,

    ich versuche den Dialog für die Konfiguration eines Modems aufzurufen. Leider komme ich damit nicht so ganz klar.
    Es gibt beim Code von unten eine Zugriffsverletzung. Was mache ich falsch. Sind die Definitionen der importierten Kernel32.dll Funktionen in windows.pas richtig??<br>
    // modemName: bekannter Name des Modems <br>
    // handle: handle des Parent Fensters <br>
    procedure ModemConfigDialog(const modemName:string; handle:HWND);<br>
    var<p>
    h:THandle;<br>
    pcc:PCommConfig;<br>
    sizeWord;<br>
    begin<br>
    (*<br>
    h:=CreateFile(<br>
    PChar('COM1'), // pointer to name of the file<br>
    0, // access (read-write) mode<br>
    0, // share mode<br>
    NIL, // pointer to security attributes<br>
    OPEN_EXISTING, // how to create<br>
    0, // file attributes<br>
    0 // handle to file with attributes to copy<br>
    );<br>
    <br>
    if h=INVALID_HANDLE_VALUE then<br>
    RaiseLastWin32Error;<br>
    *)<br>
    GetMem(pcc, sizeof(TCommConfig));<br>
    try<br>
    FillChar(pcc^, sizeof(TCommConfig), 0);<br>
    pcc^.dwSize:=sizeof(TCommConfig);<br>
    if not GetDefaultCommConfig(PChar(modemName), pcc^, size) <br>then begin<br>
    FreeMem(pcc);<br>
    GetMem(pcc, size);<br>
    pcc^.dwSize:=size;<br>
    end;<br>
    (*<br>
    if not GetCommConfig(h, pcc^, size) then<br>
    RaiseLastWin32Error;<br>
    *)<br>
    if not CommConfigDialog(PChar(modemName), handle, pcc^) <br>then<br>
    RaiseLastWin32Error;<br>
    finally<br>
    // CloseHandle(h);<br>
    FreeMem(pcc);<br>
    end;<br>
    end;<br>
    <p>
    Hansjörg Reister (mailto:[email protected])

  • #2
    Hallo,

    mit dem folgenden Beispiel kann ich unter Windows NT 4 den Konfigurations-Dialog problemlos aufrufen. Gegenüber der o.g. Version habe ich 3 Änderungen vorgenommmen: <br>
    1. Klassischer nullterminierter String anstelle der Typumwandlung<br>
    2. GetDefaultCommConfig-Parameter dwSize wird vorher initialisiert<br>
    3. Keine Zeigervariablen, sondern direkt die beiden Strukturen übergeben (d.h. keine dynamische Speicheranforderung):
    <pre>
    procedure TForm1.Button1Click(Sender: TObject);
    var
    szName : array[0..5] of char;
    aCC : TCommConfig;
    dwSize : DWORD;
    aCOMMCONFIG : _COMMCONFIG;
    begin
    szName := 'COM1' + #0;
    // beim alten Aufruf war "Size" undefiniert, SDK fordert aber [in/out]
    dwSize := SizeOf(TCommConfig);
    aCC.dwSize := dwSize;
    ShowMessage(Format('%d Bytes im Puffer Platz.', [dwSize]));
    if not GetDefaultCommConfig(szName, aCC, dwSize) then
    RaiseLastWin32Error;
    ShowMessage(Format('%d Bytes kopiert.', [dwSize]));
    if not CommConfigDialog(szName, Handle, aCOMMCONFIG) then
    RaiseLastWin32Error;
    end;
    </pre>
    P.S: Ich habe immer nur die Datentypen verwendet, die Delphi 5 in seiner Programmier-Hilfe (<b>Code-Parameter</b>) haben wollte

    Comment


    • #3
      Das wundert mich gar nicht. Mit ihrem Aufruf wird die Dialogbox zum konfigurieren eines COM Port aufgerufen. Ich möchte aber den Dialog für die Konfiguration eines Modems aufrufen. Dazu muss als erster Parameter der Name des Modems übergeben werden (der Cast ist dabei garantiert nicht das Problem). Dann erhalten Sie auch das oben geschilderte Problem (und zwar nur dann wenn sie etwas ändern und OK klicken)

      Comment


      • #4
        Hallo,

        äh - wo Sie Recht haben, haben Sie Recht. Dummerweise habe ich hier kein Modem am Rechner (und der Dialog kommt lt. SDK vom Treiber des Modems). Ich werde das mal bis zum Wochenende aufschieben ;-

        Comment


        • #5
          So jetzt habe ich es hingekriegt: Dieser Code sollte funktionieren.
          Zum testen einfach ein Standard Modem von MS installieren. Die haben bereits custom dialoge.
          <FONT SIZE=2>
          <P>// modemName: bekannter Name des Modems
          <P>// handle: handle des Parent Fensters
          <P>procedure ModemConfigDialog(const modemName:string; handle:HWND);&lt;
          <P>var
          <P>pcc:PCommConfig;
          <P>sizeWord;
          <P>begin
          <P>GetMem(pcc, sizeof(TCommConfig));
          <P>try
          <P>FillChar(pcc^, sizeof(TCommConfig), 0);
          <P>size:=sizeof(TCommConfig);
          <P>pcc^.dwSize:=size;
          <P>if not GetDefaultCommConfig(PChar(modemName), pcc^, size) then begin
          <P>FreeMem(pcc);
          <P>GetMem(pcc, size);
          <P>pcc^.dwSize:=size;
          <P>if not GetDefaultCommConfig(PChar(modemName), pcc^, size) then
          <P>RaiseLastWin32Error;
          <P>end;
          <P>if CommConfigDialog(PChar(modemName), handle, pcc^) then
          <P>if not SetDefaultCommConfig(PChar(modemName), pcc, size) then
          <P>RaiseLastWin32Error;
          <P>finally
          <P>FreeMem(pcc);
          <P>end;
          <P>end;</FONT></BODY>
          </HTML>

          &#10

          Comment

          Working...
          X