VB Variant Datentype in C einlesen/konvertieren
c147258 11.07.2005 - 09:33 4349 38
mat
AdministratorLegends never die
|
wenn ich in VB: objAlgo.Add 34 habe, dann weis ich ja selbst nicht genau was hier übergeben wird. (okay bei diesem BSP ein Integer Wert) kommt eben darauf an was VB daraus macht. natürlich kannst du dir sicher sein, dass es in den passenden typen gecastet wird. allerdings würde ich alle natürlichen zahlen (der einfachkeit halber) in c als long speichern, alle gleitkommazahlen als double. dann kannst nicht viel falsch machen, es sei den die performance des sortieralgorithmus steht im vordergrund. ginge es also nur über eine Variable? (bzw. bei diesem Programm nur über eine VARIANT Variable, alles andere kann nicht übergeben werden -> gibt es dazu keine Lösung?) ja, geht nicht anders. über die COM schnittstelle kann nur eine methode namens Add() exportiert werden.. unterschiedlicher parametertyp (so wie bei c/c++) sind hier nicht möglich. warum weiss ich selber nicht  dh: ja, du musst hier mit VARIANT arbeiten. im allgemeinen rate ich dir innerhalb der COM Methoden - zB Add() - die parameter nur aufzunehmen und in interne c/c++ basistypen zu konvertieren um danach stinknormalen c/c++ code schreiben zu können. dasselbe auch beim variablenexport. der COM teil deiner implementierung ist dann quasi nur ein wrapper für deine c/c++ funktionen.
|
DKCH
Administrator ...
|
du könntest für unterschiedliche parametertypen unterschiedliche interfaces machen. also ein interface mit add für integer, eines für double, eines für wwi noch... ist halt für den verwender umständlich(er).
|
c147258
- - - - - - -
|
jop..danke euch beiden - wird eh die einzige vernünftige Lösung sein so dann zb.: Add_int() Add_double() usw... Private Sub Command1_Click()
Dim objAlgo As Algo, _
wert As Integer
wert = 4
Set objAlgo = New Algo
objAlgo.Add wert
....
STDMETHOD(Add_int)(int value);
bis auf weitere Fehler  DANKE (einstweilen funkts noch  )
Bearbeitet von c147258 am 12.07.2005, 16:27
|
mat
AdministratorLegends never die
|
du kannst doch problemlos (wie bei meinem testprojekt) mit dem vt member des VARIANTs unterscheiden welchen typ der VARIANT gerade hat. du musst es halt nur händisch konvertieren (schau dir einfach nochmal das switch() an)
|
c147258
- - - - - - -
|
ja, da müsste ich es aber in VB vorher konvertieren, und so gib ich gleich den richtigen Datentyp ins C Programm rüber. aber ein Variant Datentyp ist glaub ich auch dabei... also keine Angst..wird schon seinen Zweck erfüllen  - Danke nochmals!
|
c147258
- - - - - - -
|
Hallo bräuchte leider schon wieder deine Hilfe Dieses Mal ist soll die Variant Variable kein Array sein sonder nur ein Wert. STDMETHODIMP CAlgo::Add(VARIANT *variant_element)
{
defDataType(variant_element);
//insertElementBegin(value, &listB, &listE);
//Quicksort_int(array_int, 0, nCount);
return S_OK;
}
//
// defDataType
// Datentyps des Elements bestimmen/definieren
//
int defDataType (VARIANT *variant_element)
{
//.vt = variant type
switch (variant_element[0].vt)
{
//Integer
case VT_I2:
{
//array_int[i] = variant_element.iVal;
break;
}
....
->> Speicherzugriffsfehler 108: switch (variant_element[1].vt)
109: {
012B1888 mov eax,dword ptr [ebp+8]
012B188B xor ecx,ecx
012B188D mov cx,word ptr [eax+10h] ----> FEHLER
Wie kann ich auf die Variant Variable nun zugreifen? bzw. ist es überhaupt möglich? also nun wird in VB ein belieber Wert übergeben (VB konvertiert selbst) und in C++ DLL wird der Datentyp als Variant angenommen und dann guck ich nach welcher Typ das nun ist und arbeite mit dem weiter. Vielen Dank!
Bearbeitet von c147258 am 13.07.2005, 14:34
|
Ringding
Pilot
|
Wie rufst du's denn von VB aus auf?
Ist variant_element == NULL?
|
c147258
- - - - - - -
|
In VB: Objekt.Add 5 Der Wert 5 wird nun der DLL - C++ Code übergeben variant_element beinhaltet ja den Wert welche von VB übergeben wird "hoffentlich"
|
mat
AdministratorLegends never die
|
du behandelst den VARIANT * wie ein VARIANT array, es gibt aber kein variant_element[1]. 108: switch (variant_element[1].vt) <= FEHLER
109: {
012B1888 mov eax,dword ptr [ebp+8]
012B188B xor ecx,ecx
012B188D mov cx,word ptr [eax+10h] ----> FEHLER
|
c147258
- - - - - - -
|
Hallo, danke nochmals.. das Problem hab ich mittlerweile gelöst, jedoch ist schon das nächste da Wenn ich in VB: wert AS INTEGER wert = 5 Objekt.Add wert dann wird der Wert 5 der C++ DLL übergeben und ich kann diese auslesen mittels: variant_elemtn->piVal jedoch: wert AS STRING wert = "hallofunktnicht" Objekt.Add wert dann wird zwar was übergeben, aber ich kann es nicht rauslesen - wenn ich debugge steht als wert "0x0.... {"halloduda"VT_BSTR|VT_BYREF} jedoch finde/sehe ich halloduda nicht irgendwo als Element gespeichert. Wie komm ich nun an den Wert/String ran?
|
mat
AdministratorLegends never die
|
vt => VT_BSTR|VT_BYREF A reference to a string was passed. A BSTR* that points to a BSTR is in pbstrVal. The referenced pointer must be obtained or freed by the BSTR functions vergiss nicht das es ein BSTR ist (!= char *). benutz USES_CONVERSION und die passenden conversion macros (einen link dazu hab ich oben schon gepostet).
|
DKCH
Administrator ...
|
statt der atl-conversion-macros sind auch die div. wrapper-klassen (_bstr_t, _variant_t) ganz nett.
|
c147258
- - - - - - -
|
benutz USES_CONVERSION und die passenden conversion macros Könntest du mir evtl. ein Beispiel dafür geben? (für String/Zahl) Vielen Dank MFC Technical NotesFolgendes Problem ist nun wieder aufgetaucht - ich muss jeden Wert (auch Integer umwandeln) da dieser in C++ als SHORT * dagestellt wird, und somit kann ich ihn nicht einfach einer Integer Var. zuweisen  Wäre dir sehr dankbar ....  EDIT: zudem wenn ich VariantInit(variant_element_type); verwende dann steht nach dem Aufruf - VT_EMPTY drinnen... EDIT: ES WIRD NUN BEI VB NUR EIN VARIANT TYP ÜBERGEBEN Danke für Eure Hilfe, werd mich melden wenns wieder Probleme gibt
Bearbeitet von c147258 am 14.07.2005, 12:52
|
c147258
- - - - - - -
|
Bin schon wieder da.... VB wert AS VARIANT wert = "hallo" Objekt.Add wert C++ VARIANT *variant_element_type "h" wird übergeben - wie komm ich an die weiteren Zeichen ran? Danke..
|
mat
AdministratorLegends never die
|
zeig mal den teil code her, der den BSTR * zu einem char * konvertiert.
|