Autor Beitrag
relapse
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Di 21.02.12 12:15 
Hallo, eine neue Frage von mir: Ich muss folgendes Beispiel im Pseudocode in C# umsetzen:

ausblenden Quelltext
1:
2:
3:
DoVerb("Documents[0].pages[2]", "TranslateScreenPoint", DataIn(sx, sy), DataOut, 0);
px = DataOut[0]; // Page x coordinate
py = DataOut[1]; // Page y coordinate


Die Funktion DoVerb hat diese Signatur:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
HRESULT DoVerb(
BSTR ObjectName,
BSTR OperationName,
VARIANT DataIn,
VARIANT* DataOut,
LONG Flags
);


In C# werden DataIn und DataOut als "object" bzw. "out object" definiert.

Hat jemnand eine Idee wie man ein "object" in ein "long[]" konvertieren kann?



Danke!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 21.02.12 12:57 
Zitat:
In C# werden DataIn und DataOut als "object" bzw. "out object" definiert.


Hast du den entsprechenden P/Invoke (darum geht doch oder und nicht einfach um Pseudocode) Aufruf den schon ausprobiert? Wenn ja solltest du doch das zurück gegebene object im Debugger inspizieren können um rauszufinden was du damit anstellen kannst.
relapse Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Di 21.02.12 15:24 
Das geht so (vielleicht nicht besonders elegant, funktioniert aber trotzdem):

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
object[] dataIn = new object[2];
dataIn[0] = koordinatenWindow[0]; // double-Werte
dataIn[1] = koordinatenWindow[3];
var dataOut = new object();
ax.DoVerb("Documents[0].pages[" + docSeite + "]""TranslateScreenPoint", dataIn, out dataOut, 0);
double[] arr = new double[2];
arr = (double[])dataOut;
double px = arr[0];
double py = arr[1];


Nach dem Aufruf der DoVerb-Funktion war der out-Parameter "dataOut" mit Daten gefüllt, nur konnte ich auf die mit Hilfe des []-Operators nicht zugreifen. Das war ja das eigentliche Problem. Nun nach dem Casten (oder Boxen?) war es möglich.


P.S.: Pardon, das war eigentlich "Konvertieren von object in double[]".
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 21.02.12 18:13 
Hallo relapse,

dann ist aber das Neuanlegen des Arrays (new double[2]) völlig überflüssig, da du den Variablen-Inhalt gleich wieder in der nächsten Zeile überschreibst.
Demnach besser gleich so:
ausblenden C#-Quelltext
1:
double[] arr = (double[])dataOut;					


Bzw. die P/Invoke-Deklaration der Methode so abändern, daß es gleich als double[] zurückgegeben wird.
relapse Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Mi 22.02.12 09:01 
Zitat:
Bzw. die P/Invoke-Deklaration der Methode so abändern, daß es gleich als double[] zurückgegeben wird.


Wie geht das? Kannst du bitte es zeigen?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 22.02.12 11:27 
Hallo relapse,

woher kommt denn die Deklaration von DoVerb und was ist ax für eine Klasse?
Wenn ich das jetzt so lese, scheint mir das eher ein "ActiveX"-Objekt zu sein (und kein eigener P/Invoke).

Dann gibt es keinen anderen Weg als die nachträgliche Konvertierung des Datentyps von object in double[].
relapse Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Mi 22.02.12 14:23 
Ja genau, das ist ein ActiveX-Steuerelement.

Was ist denn ein P/Invoke?