VB und COM: Wert HRESULT auslesen?

Hi,
ich arbeite mit VB und COM. Wenn ich eine Routine z.B. in C++ schreibe, sieht die z.B. so aus:

HRESULT test(/\*[in]\*/BSTR test1,/\*[out,retval]\*/ BSTR \*test2)
{ \*test2 = test1;
 return S\_OK;
}

Wenn ich jetzt von VB drauf zugreife, habe ich eine Methode test, die einen Parameter test1 erwartet und einen Parameter Test2 zurückgit. Wie komme ich denn jetzt an den Wert von HRESULT oder komme ich da garnicht dran? Wie kann ich testen, ob der S_OK,S_FALSE oder irgend einen S_ERROR zurückliefert?

Ralph

Hallo
Ich möchte unbedingt Beispiele für API-Calls für VB empfehlen .
Normalerweise bekommt man das Ergebnis eines API Call’s etwa so :
Ergebnis = Apicallxyz ( Parameter1 , Parameter1 + n … )
Dabei können auch Strukturen in den Parametern übergeben werden , welche nachher Informationen enthalten .
Es müssen nicht die Parameter oder Strukturen selbst übergeben werden , es kann sich auch um Adressen handeln , auf welcher sich die Parameter befinden oder nachher befinden sollen .
Ds steht im Handbuch für VB oder auch in der Online Hilfe .
Im Praktischen wird der gemeinsame Stack verwendet , und zur Übermittlung von Integer-Werten auch Register .
Hresult steht glaub ich nachher im EAX Register , es geht jedoch automatisch über die Konvention .
MfG

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Das ist leider keine Antwort auf meine Frage…
Hört sich ja alles toll an, aber die Frage war: „Wie komme ich aus VB an den HRESULT-Wert?“

Ralph

Hallo Ralph,

ich arbeite mit VB und COM. Wenn ich eine Routine z.B. in C++
schreibe, sieht die z.B. so aus:

HRESULT test(/*[in]*/BSTR test1,/*[out,retval]*/ BSTR
*test2)
{ *test2 = test1;
return S_OK;
}

Wenn ich jetzt von VB drauf zugreife, habe ich eine Methode
test, die einen Parameter test1 erwartet und einen Parameter
Test2 zurückgit. Wie komme ich denn jetzt an den Wert von
HRESULT oder komme ich da garnicht dran?

Du machst da einen Denkfehler:
Denn deine Funktion „test()“ wird gar nie von VB aufgerufen !!!
Wenn du dir einmal deine ganze Sourcecode anschaust, siehst du, dass „test()“ durch „proxys“ gekapselt wird. Darumherum werkeln noch die ganzen Transportmechanismen des COM-Mechanismus und diese werten „HRESULT“ aus. An VB wird nur das Weitergeben was mit „[out…]“ bzw. von VB übernommen wenn’s mit „[in…“ deklariert wurde.

MfG Peter(TOO)

Hört sich ja alles toll an, aber die Frage war: „Wie komme ich
aus VB an den HRESULT-Wert?“

Ralph

Die Frage habe ich beantwortet …

Ergebnis = Functionxyz ( Parameter1 bis 1 +n )

Nachher steht in „Ergebnis“ das Ergebnis , Funktionxyz ist die Funktion , Parameter1 bis sowieso die Parameter .

Das heißt , Du stellst eine Funktion in Deiner Dll zur Verfügung , welche das Ergebnis liefert .
Damit hast Du ein genaues Beispiel zum Praktischen , das andere waren Erläuterungen zum Technischen . So wird es auch mit Funktionen des Windows API gemacht , wovon viele in C geschrieben sind .
Von C habe ich keine Ahnung , Aber die Funktion muß öffentlich , public oder extern gemacht werden , je nach dem , wie sich das in C nennt .

Im Übrigen gibt es das Handbuch , die Hilfe und die Online Hilfe . Das Problem ist nicht allzu schwierig , um es selbst zu lösen .
Da steht dann allerdings noch drin , das die zugehörige DLL und die externe Funktion vorher definiert, deklariert werden müssen ( in VB ), damit alles sofort zur Verfügung steht ( im Ram-Speicher ) . Das VB findet und lädt dann automatisch die DLL und sucht auch die Adresse Deiner Funktion .
Ich sag es noch einmal , am einfachsten suchst Du Dir Beispiele im Internet zur VB-Programmierung , denn viele Sachen kann man nur mit API-Calls bewältigen .
Bei Google eintippen :
VB API-Calls C Functions Deklaration
oder ähnlich .

MfG

Hallo Namensvetter,

ich habe meine alten Sourcen nicht zur Hand, deswegen ungeprüft folgende Aussage:

Wenn ein COM-Aufruf etwas anderes als S_OK zurückgibt (insbesondere E_xxx-Codes, bei S_FALSE weiss ich’s nicht) löst VB eine Exception aus.

Wenn Du die mit On Error … abfängst, müßtest Du den HRESULT-Wert als Fehlernummer sehen können.

Gruß, Ralf

Du scheinst meine Frage nicht verstanden zu haben!
Ich weiss, die man Parameter in eine Methodendeklaration reinschreibt und wie in meinem ersten Posting stand, hatte diese Beispielfunktion auch einen Rückgabewert.

Ich habe das Gefühl, dass du mir antwortest, ohne ATL/COM zu kennen. Mir geht es darum, dass jede Methode eines COM-Objekts in C++ einen Rückgabewert HRESULT hat. Diesen Rückgabewert möchte ich aus VB auslesen. Da aber VB den als [out,retval] deklarierten Wert zurückgibt (Wie es auch geplant war!), steht da natürlich nicht der Wert, den HRESULT zurückliefert.

An diesen Wert möchte ich dran kommen, nicht an irgendwelche Parameter.

Ralph

Alles klar , ich bitte um Entschuldigng . Ich dachte der Aufruf von Adressen oder Programmen in externen Dll’s sei das Problem , und bei diesem „COM“ muß ich ehrlich sagen , das ich keine Ahnung von habe .
Trotzdem war die Rede von einem Aufruf einer Routine in C , und da hast Du die Möglichkeit , den Hresult Wert als Parameter zu Übergeben , indem Du das Unterprogramm oder die Funktion nicht von VB aus aufrufst , sondern zum Beispiel von einer anderen Funktion in Deinem C-Code , welche den Hresult Wert mit in die Parameter packt .

Ein Trostpflaster(Link) habe ich noch , falls Du Englisch kannst :

http://search.microsoft.com/gomsuri.asp?n=1&c=rp_Res…

Bei diesem Com bin ich ehrlich gesagt selbst noch nicht durchgestiegen , halte ich für meine Zwecke für unwichtig , aber es spielt ja eine Rolle bei Internetanwendungen usw…
Ich fand unter anderem die Begriffe
IRepository::QueryInterface
IRepositoryErrorQueueHandler
und noch mehr .
MfG

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]