SiDiary > Allgemeines |
AddIn SDK - RequestData |
(1/2) > >> |
Mastacheata:
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. --- Code: --- 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!"); } --- Ende Code --- 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 |
Mastacheata:
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) |
Alf:
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. |
Mastacheata:
--- Zitat von: Alf 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). --- Ende Zitat --- 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. --- Zitat von: Alf am Februar 08, 2017, 14:49 ---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. --- Ende Zitat --- 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). --- Code: --- String UDT = "CGMS"; IntPtr UDTptr = Marshal.StringToHGlobalAnsi(UDT); int UDTID = mAddInObject.GetUDTID(UDTptr.ToInt32()); Marshal.FreeHGlobal(UDTstr); --- Ende Code --- 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? |
Alf:
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? |
Navigation |
Themen-Index |
Nächste Seite |