MW.net - IPC Interface (nicht nur) für .net

Forumsregeln
Um uns Moderatoren die Arbeit ein bisschen abzunehmen, gibt es in diesem Unterbereich gewisse, zusätzliche Regeln, die eingehalten werden müssen:
......
Fortsetzung in folgendem Thread: Regeln für diesen Forenbereich
Nelix
Beiträge: 12
Registriert: Mi 8. Apr 2009, 13:40

MW.net - IPC Interface (nicht nur) für .net

Beitrag von Nelix » Do 9. Apr 2009, 11:04

Hallo,

hier nun also Version 2.0 meines IPC-Interfaces von MWConn (nicht nur) für .net Sprachen.

Die neue Version ist komplett neu geschrieben, die Kommunikation läuft direkt über die entsprechenden API-Calls in .net ab. Es sind alle Features des IPC-Interfaces integriert, also auch das Senden und Empfangen von Kommandos ist implementiert.
Die DLL ist "COM-Sichtbar", kann also auch von nicht .net Sprachen angesprochen werden, auch eine Verwendung mit Javascript ist möglich, um z.B. ein MWConn Windows Gadget zu realisieren.

Geschrieben ist díe DLL in C# mit Visual Studio 2010 und für das .net Framework 2.0.

Im Anhang findet ihr den kompletten Sourcecode, ein Beispielprojekt das die Verwendung demonstriert und die entsprechende Dokumentation.

Fragen, Anregungen und Bug-Reports immer zu mir. :D
Dateianhänge
MWConnIO-Demo.png
MWConnIO-Demo.png (56.25 KiB) 5737 mal betrachtet
MWnet_2_0.zip
Version 2.0. Inkl. Demo Projekt, Sourcen und Dokumentation
(305.62 KiB) 436-mal heruntergeladen
MWnet_1_0.zip
Binarys + Quelltext + Beispielprojekt + Klassendokumentation
(339.21 KiB) 368-mal heruntergeladen
Zuletzt geändert von Nelix am Mi 25. Aug 2010, 15:10, insgesamt 1-mal geändert.

croydon
Beiträge: 11
Registriert: Mi 25. Mär 2009, 11:26

Re: MW.net - IPC Interface für .net

Beitrag von croydon » Mi 20. Mai 2009, 13:47

Waaaas - ein Centrafuse Plugin??? Etwa auch zum SMS senden und empfangen *g* ????

Daran bastel ich nämlich auch gerade (siehe SMS-Man) - allerdings hab ich das Ganze bislang noch nicht als Plugin, sondern erst einmal als Stand-alone-Programm.

Meine .net Kenntnisse sind noch nicht so berauschend, als daß ich mich an ein ganzes Plugin wagen würde, aber ich wäre seeeeeeehr heiß daran interessiert, Deines dann zu testen und werde mir auch mit Sicherheit das Interface mal ansehen, genau sowas hab ich nämlich für meine Idee auch schon gesucht...

Gruß,
Croydon

Nelix
Beiträge: 12
Registriert: Mi 8. Apr 2009, 13:40

Re: MW.net - IPC Interface für .net

Beitrag von Nelix » So 24. Mai 2009, 13:55

Also SMS an SMS empang/senden hab ich noch ar nicht gedacht, vor allem weil das Centrafuse das schon über das Phonemodul kann.

Schau mal bei centrafuse.de ins Forum da findest du mehr über mein Plugin.

Wäre aber ne schöne ergänzung. :P

Evtl. können wir die Projekte ja "zusammenwerfen", bei interesse schreib mir mal ne Email.

So kompliziert ist die Pluginentwicklung im übrigen gar nicht, es gibt ein scönes SDK für CF.

croydon
Beiträge: 11
Registriert: Mi 25. Mär 2009, 11:26

Re: MW.net - IPC Interface für .net

Beitrag von croydon » Mi 27. Mai 2009, 09:47

Ja ich hab schon ein wenig mit dem SDK herumgespielt, das ist eigentlich auch weniger das Problem - mein Problem ist, daß ich noch viel zu sehr VB6 behaftet arbeite und denke und .net doch ein wenig andere "Herangehensweisen" erfodert. Diese Umstellung wird mich noch ein wenig beschäftigen. Danach können wir gerne über eine Zusammenfassung nachdenken ;-)

Die SMS-Funktion über Bluetooth/Phone bringt mir leider nichts, wenn ich das über den Stick machen möchte - ich nutze hier das Tchibo-Angebot mit dem SMS-Paket, das kommt mich günstiger als jedes Handy. Außerdem hab ich arge Probleme, den Bluesoleil auf meinem Car-PC ordentlich ans laufen zu bringen (aber das ist hier zu sehr off-topic...).

Gruß,
Croydon

croydon
Beiträge: 11
Registriert: Mi 25. Mär 2009, 11:26

Re: MW.net - IPC Interface für .net

Beitrag von croydon » Mi 27. Mai 2009, 11:45

So, jetzt hab ich mir die DLL mal angesehen - mir fehlt allerdings noch der direkte Zugriff auf die Kommando-Funktion - im Interface müsste diese enthalten sein, da sie offensichtlich von den Connect/Reconnect/Disconnect Funktionen aus aufgerufen wird.

Was ich bräuchte wäre dieses:
Aus dem mwconn-Manual
char command[100]; // von MWconn auszuführendes Kommando;
// "MWCONN_CONNECT": verbinden;
// "MWCONN_DISCONNECT": trennen;
// "MWCONN_RECONNECT": neu verbinden;
// "MWCONN_END": Programm beenden;
// ":::ATI": AT-Kommando an Gerät senden (hier "ATI");
// bei Novatel-Geräten nur mit Novatel-DLL;
// ":250:4000:ATI": desgleichen, jedoch mit
// Wartezeitangaben, 250ms nach dem Senden
// beginnt der Empfang, welcher maximal 4 weitere
// Sekunden später abgeschlossen sein muss;
// Datenrichtung MWconn->extern
// Hinweis: nicht alle Datenkarten unterstützen alle Informationen;
Also die Möglichkeit über IPC direkt AT-Kommandos zu senden - damit würden sich dann die langen SMS über das PDU Protokoll realisieren lassen.

Gruß,
Croydon

cware
Beiträge: 128
Registriert: Mo 4. Aug 2008, 19:42

Re: MW.net - IPC Interface für .net

Beitrag von cware » Mi 27. Mai 2009, 15:07

Ich habe mir den Code gerade mal ein wenig angeguckt und ein paar Modifikationen vorgenommen, damit man auch Befehle an MWconn richten kann.

Fangen wir an bei der DLL. Folgenden Code habe ich ergänzt:

Code: Alles auswählen

function MWconn_GetCommand(var AStringPointer: PChar; AStringLength : Integer) : Integer; stdcall; export;
begin
  Result := - 1;

  // check if IPC is open
  if (vBufferB <> nil) then
  begin
    // check if we have read access
    if (vAccessMode <> mwamNone) then
    begin
      try
        if (AStringLength > Length(vBufferB^.Command)) then
          AStringLength := Length(vBufferB^.Command);

        // copy data from answer buffer
        Move(vBufferB^.Command, AStringPointer, AStringLength);

        Result := AStringLength;
      except
      end;
    end;
  end;
end;

function MWconn_SetCommand(var AStringPointer: PChar; AStringLength : Integer) : Boolean; stdcall; export;
begin
  Result := false;

  // check if IPC is open
  if (vBufferB <> nil) then
  begin
    // check if we have write access
    if ((vAccessMode = mwamWrite) or (vAccessMode = mwamAll)) then
    begin
      try
        // prevent buffer overflow
        if (AStringLength < Length(vBufferB^.Command)) then
        begin
          // copy data to command buffer
          Move(AStringPointer, vBufferB^.Command, AStringLength);
          vBufferB^.Command[AStringLength] := #0;

          Result := true;
        end;
      except
      end;
    end;
  end;
end;

function MWconn_Answer(var AStringPointer: PChar; AStringLength : Integer) : Integer; stdcall; export;
begin
  Result := - 1;

  // check if IPC is open
  if (vBufferB <> nil) then
  begin
    // check if we have read access
    if (vAccessMode <> mwamNone) then
    begin
      try
        if (AStringLength > Length(vBufferB^.Answer)) then
          AStringLength := Length(vBufferB^.Answer);

        // copy data from answer buffer
        Move(vBufferB^.Answer, AStringPointer, AStringLength);

        Result := AStringLength;
      except
      end;
    end;
  end;
end;
Zudem muss die exports-Klausel erweitert werden:

Code: Alles auswählen

exports
[...]
  MWconn_GetCommand,
  MWconn_SetCommand,
  MWconn_Answer;
Danach fehlt nur noch das Wrapping in der Mw.net.cs.
Der Import der Methoden:

Code: Alles auswählen

        [DllImport("MWconnIO.dll")]
        private static extern int MWconn_GetCommand(ref string Command, int iStrLen);

        [DllImport("MWconnIO.dll")]
        private static extern bool MWconn_SetCommand(ref string Command, int iStrLen);

        [DllImport("MWconnIO.dll")]
        private static extern int MWconn_Answer(ref string Answer, int iStrLen);
Die Definition der Property-Handler:

Code: Alles auswählen

        /// <summary>
        /// Einen Befehl ausführen lassen
        /// </summary>
        public string Command
        {
            get
            {
                return GetCommandVar();
            }
            
            set
            {
              SetCommandVar(value);
            }
        }

        /// <summary>
        /// Die Antwort zu einem ausgeführten Befehl
        /// </summary>
        public string Answer
        {
            get
            {
                return AnswerVar();
            }
        }
Die Erweiterung des "String-Hacks" (die Answer kann bis zu 600 Zeichen lang sein):

Code: Alles auswählen

        // Hacks um Strings aus der Pascal-DLL herauszubekommen
        int maxLen = 768;// 256;
Und schlussendlich die Hilfsmethoden:

Code: Alles auswählen

        private string GetCommandVar()
        {
            string GetCommandVar_Temp = new string(' ', maxLen);
            MWconn_GetCommand(ref GetCommandVar_Temp, maxLen);
            return GetCommandVar_Temp;
        }

        private bool SetCommandVar(string ACommand)
        {
            return MWconn_SetCommand(ref ACommand, ACommand.Length);
        }

        private string AnswerVar()
        {
            string AnswerVar_Temp = new string(' ', maxLen);
            MWconn_Answer(ref AnswerVar_Temp, maxLen);
            return AnswerVar_Temp;
        }
Wäre nett, wenn das ganze jemand mal testen könnte. Ich konnte zwar testhalber die DLL kompilieren, um Syntaxfehler auszuschließen, allerdings fehlt mir hier zur Zeit die .NET-Umgebung, um auch den C#-Code überprüfen zu können.

Wenn man übrigens in der DLL alle Windows.CopyMemory() durch SysUtils.Move() ersetzt und die Windows-Unit und die Classes-Unit aus der uses-Klausur rausschmeißt, halbiert sich die Größe der DLL... :mrgreen:


cheers...

Nelix
Beiträge: 12
Registriert: Mi 8. Apr 2009, 13:40

Re: MW.net - IPC Interface für .net

Beitrag von Nelix » Mi 3. Jun 2009, 16:42

Hallo,

super, genau an ser Stelle bin ich selber nicht weitergekommen.

Habe gerade deinen Code in die DLL(s) "eingearbeitet" und versucht mal ein Kommando zu senden, leider bis jetzt erfolglos. :(

Das senden des Commandos klappt scheinbar, zumindest ohne Fehlermldung, wenn ich aber versuche die Antwort per .answer zu lesen oder das Commando wieder auslesen will beendet(!) sich mein Programm kommentarlos, sogar der Visual Studio Debugger meldet dann einfach "Prozess beendet", der Fehler lässt sich auch nicht per try ... catch abfangen.

cware
Beiträge: 128
Registriert: Mo 4. Aug 2008, 19:42

Re: MW.net - IPC Interface für .net

Beitrag von cware » Mo 8. Jun 2009, 18:32

Hm, das ist sehr merkwürdig... ich habe bei der Stringübergabe (etc.) darauf geachtet, genauso vorzugehen wie du... :(


cheers...

Nelix
Beiträge: 12
Registriert: Mi 8. Apr 2009, 13:40

Re: MW.net - IPC Interface für .net

Beitrag von Nelix » Mo 8. Jun 2009, 20:16

Hallo,

da das Visual Studio keine weitere Fehlermeldung ausgibt und ihm der Prozess quasi "unterm Hintern" beendet wird, gehe ich davon aus das der Fehler im Ummanged Memory, sprich in der MWconnIO.dll (also im Pascal Teil) liegt, denn dort hat der VS Debugger keinen Zugriff.

BTW:
Wie debugged man Delphi 7 Dll's? :roll:
In VS Studio kann man DLL's an einen (laufenden) Prozess anhängen und die DLL in der Zielanwendung debuggen, geht sowas ähnliches auch in Delphi? So müsste man dem Fehler doch auf die Spur kommen.
Meine Pascal bzw. Delphi Kenntnisse sind sehr rudimentär.

cware
Beiträge: 128
Registriert: Mo 4. Aug 2008, 19:42

Re: MW.net - IPC Interface für .net

Beitrag von cware » Mo 15. Jun 2009, 10:21

Bei Delphi funktioniert auf genau die gleiche Weise... :D

Ich mache es meistens über Start->Parameter... - dort kannst du eine Hostanwendung definieren, die für's Debuggen herhalten soll... ;)


cheers...

Antworten