Autor Thema: AddIn SDK - RequestData  (Gelesen 384 mal)

Offline Mastacheata

  • Full Member
  • ***
  • Beiträge: 67
  • Country: de
  • Diabetestyp: DM 1
  • Therapie: Insulin-Pen
AddIn SDK - RequestData
« am: Februar 07, 2017, 23:59 »
Hallo,

hätte da zwei Fragen zur RequestData Methode vom AddIn SDK:
Die erste ist mehr ein Verbesserungsvorschlag weil ich fast sicher bin, dass es keinen Weg gibt ein Variable Length Array in Managed Code zu erstellen.
Wie man in meinem Code Snippet weiter unten sehen kann habe ich das retData Array hier mit 999999 Elementen leer initialisiert. Ich glaube es gibt keine Möglichkeit in .Net ein Array zu erstellen und zu verwenden ohne es vorher zu initialisieren. Soweit die Dokumentation und das Interface der SiDiaryNet.dll das hergeben gibt es aber auch keine Methode um vor dem Datenabruf zuerst mal nur die Anzahl der Ergebnisse abzufragen. Bleibt mir hier wirklich nur der Weg das Array einfach mit System.Int32.MaxValue Elementen zu initialisieren und jede Menge Speicher unnützerweise zu allozieren?

Meine zweite Frage bezieht sich auf das optionale "ptTypeFilter" Argument:
Aus dem retData Objekt weiß ich, dass die CGMS Werte den Typ 121 haben (steht so auch im Programm selbst wenn man weiß wo die Zahl steht).
Laut Doku ist alles > 100 user-defined und man soll in der SaveData Methode nachsehen wie der Filter aussehen muss.
Da widederrum steht, nach UDTs filtern geht nur wenn man UDT der Zahl voranstellt.
In der requestData Methode funktioniert aber weder 121 noch UDT121 als Filter auch mit Komma vorne und/oder hinten klappt's nicht.

Hatte hier eben noch geschrieben, dass es mit Komma als verpflichtendem, nutzlosen Zeichen kappt. das lag aber nur daran, dass ich einen Zeitraum gefiltert hatte, der nichts anderes als 121 enthielt.


            string today = DateTime.Today.ToString();
            string lastMonth = DateTime.Today.AddMonths(-1).ToString();

            cAddInDataType[] retData = new cAddInDataType[99999];
            int retCount = 0;
            string error = "";

            if (mAddInObject.RequestData(lastMonth, today, ref retData, ref retCount, ref error, "UDT121"))
            {
                System.Windows.Forms.MessageBox.Show("Requested Data is fine");
            }
            else
            {
                System.Windows.Forms.MessageBox.Show("Requested Data is BROKEN!");
            }

Einen Filter für die "händisch" gescannten Werte scheint es nicht zu geben, dafür tauchen diese aber mit identischem Timestamp zweimal in Folge auf. So muss man zwar die ganze Liste durchgehen, aber immerhin kommen wir meinem Exportformat aus dem anderen Thread schon etwas näher :D
Gruß
Benedikt

Offline Mastacheata

  • Full Member
  • ***
  • Beiträge: 67
  • Country: de
  • Diabetestyp: DM 1
  • Therapie: Insulin-Pen
Re: AddIn SDK - RequestData
« Antwort #1 am: Februar 08, 2017, 00:24 »
Ich benutze den Thread jetzt einfach mal weiter für noch eine Frage:
Ist in SiDiary irgendein Kopierschutz eingebaut der mich daran hindern soll das Programm zu debuggen?
Wenn ich meine DLL kompiliere und ins SiDiary AddIn Verzeichnis schmeißen lasse und als Debugging Auftrag angebe die SiDiary.exe zu starten, stürzt mir das Programm sofort ab (VS fragt mich zwar ob ichs debuggen möchte, kriegt's aber nicht gebacken weil schon ein anderer Debugger Attached ist (der angeblich nur .NET 4.5 kann).

Der Trick um mein Plugin trotzdem zu debuggen liegt darin, SiDiary einfach so zu starten und erst nachträglich den Debugger zu attachen. Einziges Problem: Da ich meinen Code aktuell vollständig in der AppInit Methode untergebracht habe muss ich das erst einmal ins Addin Menü um mein Plugin zu deaktivieren und aktivieren (anscheinend passiert das automatisch beim öffnen des Addin menü alle plugins deaktiviert werden und beim schließen werden die angehakten wieder gestartet)
Gruß
Benedikt

Offline Alf

  • Administrator
  • Special Member
  • *****
  • Beiträge: 6072
  • Country: 00
  • Mein Name ist Shumway. Gordon Shumway.
    • Diabetikertagebuch
  • Diabetestyp: ---
  • Therapie: ---
Re: AddIn SDK - RequestData
« Antwort #2 am: Februar 08, 2017, 14:49 »
Normalerweise müsstest Du das leere Array übergeben können (einfach ohne Initialisierung oder wenn Du die Compiler-Warning unterdrücken willst mit Null initialisieren).

SiDiary ist nicht als Managed Code entwickelt (deshalb wahrscheinlich auch die Debugger-Probleme) und der Austausch läuft über eine COM-Schnittstelle, die über einen DotNet-Broker an Deine AddIn-DLL vermittelt wird. Das ist tatsächlich leider etwas umständlich mit mehreren Zwiebelschichten, liess sich aber nicht anders implementieren, um auch die Abwärtskompatibilität zu erhalten. Sollte die RequestData-Methode mit dem nicht initialisierten Array nicht klappen, müsstest Du vielleicht auf die RequestData_() Methode als Fallback ausweichen und den Stringblock als Container verwenden.

Der Datenfilter erwartet rein nummerische Angaben, d.h. Du musst Dir erst für den CGMS-Datentyp die zugehörige ID liefern lassen mit GetUDTID("CGMS") und diese ID zusammen mit den anderen gewünschten Datentypen Semikolon-separiert als Filter übergeben.
DM 1, ICT mit Lantus/Humalog/Insuman Rapid, Freestyle Mini, SiDiaryW32, SiDiaryPPC, SiDiarySmp
Diabetes Software, Windhorst, Tennis

Offline Mastacheata

  • Full Member
  • ***
  • Beiträge: 67
  • Country: de
  • Diabetestyp: DM 1
  • Therapie: Insulin-Pen
Re: AddIn SDK - RequestData
« Antwort #3 am: Februar 14, 2017, 15:28 »
Normalerweise müsstest Du das leere Array übergeben können (einfach ohne Initialisierung oder wenn Du die Compiler-Warning unterdrücken willst mit Null initialisieren).
An Null hatte ich natürlich nicht gedacht.  :patsch:
Uninitialisiert mag C# nicht, der Compiler schmeißt direkt einen Fehler und nicht bloß eine Warnung.

Der Datenfilter erwartet rein nummerische Angaben, d.h. Du musst Dir erst für den CGMS-Datentyp die zugehörige ID liefern lassen mit GetUDTID("CGMS") und diese ID zusammen mit den anderen gewünschten Datentypen Semikolon-separiert als Filter übergeben.
Die Beschreibung der GetUDTID Funktion überspringt leider den für mich wichtigen Schritt wie ich von managed String zu integer komme und nimmt einfach an, dass das implizit konvertiert wird. (wird es nicht)
Wenn ich jetzt einfach mal annehme die Funktion will eigentlich die Adresse von einem Zeiger auf einen unmanaged string, dann müsste ich ja einfach nur meinen managed string in den Globalen Speicher kopieren (sonst wird die Garbage Collection von .Net den String früher oder später durch die Gegend schubsen und die Adresse sich ändern).
            String UDT = "CGMS";
            IntPtr UDTptr = Marshal.StringToHGlobalAnsi(UDT);
            int UDTID = mAddInObject.GetUDTID(UDTptr.ToInt32());
            Marshal.FreeHGlobal(UDTstr);
Aber Pustekuchen :(
GetUDTID gibt nur -1 zurück.

Könnt Ihr mir da bitte nochmal aushelfen und verraten wie genau ich den String übergeben muss?
Gruß
Benedikt

Offline Alf

  • Administrator
  • Special Member
  • *****
  • Beiträge: 6072
  • Country: 00
  • Mein Name ist Shumway. Gordon Shumway.
    • Diabetikertagebuch
  • Diabetestyp: ---
  • Therapie: ---
Re: AddIn SDK - RequestData
« Antwort #4 am: Februar 15, 2017, 08:47 »
Ich weiss ehrlich gesagt nicht, wieso Du dort marshallen willst? ;)

int UDTID = mAddInObject.GetUDTID("CGMS");

sollte es eigentlich tun aber da müsste doch auch ein C#-Samplecode dabei sein, wie dort generell Strings übergeben werden.

Letztlich baust Du ja keine Brücke zur Com-Welt, sondern Dein AddIn kommuniziert mit einem DotNet-Layer unserer Com-AddIn-Schnittstelle, von daher sollten die Standard-DotNet-Datentypen funktionieren...vielleicht ist das auch das Problem, warum Dein Datenfilter bei RequestData nicht beachtet wird?
DM 1, ICT mit Lantus/Humalog/Insuman Rapid, Freestyle Mini, SiDiaryW32, SiDiaryPPC, SiDiarySmp
Diabetes Software, Windhorst, Tennis

Offline Mastacheata

  • Full Member
  • ***
  • Beiträge: 67
  • Country: de
  • Diabetestyp: DM 1
  • Therapie: Insulin-Pen
Re: AddIn SDK - RequestData
« Antwort #5 am: Februar 15, 2017, 17:39 »
Hier mal die Signatur der GetUDTID wie sie in der SiDiaryNET.dll steht (Hervorhebung durch mich):
public static int GetUDTID(int ptUDTKey) {...}
Und dann hier nochmal dein Beispielcode (wieder mit Hervorhebung):
int UDTID = mAddInObject.GetUDTID("CGMS");

Wie du siehst versucht der Beispielcode einen String zu übergeben, die Funktion erwartet aber einen Integer als Parameter.
Es geht wirklich um den Parameter nicht um den Rückgabewert der Funktion.

Zitat
sollte es eigentlich tun aber da müsste doch auch ein C#-Samplecode dabei sein, wie dort generell Strings übergeben werden.
Naja bei den Funktionen die Strings erwarten wird einfach ein String übergeben, aber die GetUDTID Funktion wird leider in keinem der Beispiele verwendet. Die Funktion ist irgendwie "kaputt". Vermutlich fehlt da irgendein Zwischenschritt beim übersetzen eurer COM Schnittstelle in .NET Code.
Weil der Parameter mit hoher Wahrscheinlichkeit so wie er im Moment ist einen Pointer enthalten sollte, war meine Idee, dass hier irgendwo ein Schritt beim übersetzen von managed Code in unmanaged Code für die COM Schnittstelle auf der Strecke geblieben ist in eurer .NET Api Bibliothek. Und zwar hab ich vermutet, dass die GetUDTID 1:1 an ein Pendant in der COM Schnittstelle weitergegeben wird ohne vorher den Parameter zu "übersetzen".
Der Parameter war also mal als String by Reference gedacht (also im Endeffekt ein IntPtr auf den String). Das widerrum geht mit managed Strings aber einfach gar nicht. Also mein Versuch den String in einen unmanaged String zu "übersetzen" und dann den Pointer darauf an die Funktion zu übergeben. Also im Endeffekt das was die Funktion selbst machen müsste um .NET Strings an eine "intern genutzte" COM API weiterzugeben.
Gruß
Benedikt

Offline Alf

  • Administrator
  • Special Member
  • *****
  • Beiträge: 6072
  • Country: 00
  • Mein Name ist Shumway. Gordon Shumway.
    • Diabetikertagebuch
  • Diabetestyp: ---
  • Therapie: ---
Re: AddIn SDK - RequestData
« Antwort #6 am: Februar 16, 2017, 10:57 »
Das schaue ich mir mal an, dann wäre der DotNet-Wrapper an der Stelle tatsächlich nicht korrekt abgebildet...
DM 1, ICT mit Lantus/Humalog/Insuman Rapid, Freestyle Mini, SiDiaryW32, SiDiaryPPC, SiDiarySmp
Diabetes Software, Windhorst, Tennis

 

Back to top