ERLEDIGT
NEIN
NEIN
ANTWORTEN
20
20
ZUGRIFFE
917
917
EMPFEHLEN
-
Hallo,
Wie kann ich eine C# Klasse in C++ verwenden?
Kompilierubg erfolgreich, Assemblies eingestellt, ok, nur erhalte ich eine Fehlermeldung und das C++ Programm crasht.
RegAsm.exe durchgeführt 2 mal
habe mich ein wenig nach diesen Link gerichtet:
http://support.microsoft.com/kb/828736
doch irgendwie stimmt was nicht....
C# DLL:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
using System; using System.Collections.Generic; using System.Text; namespace dBaseDotNet { public interface Class1 { string Test_Class1(); }; public class dBaseDotNet:Class1 { public string Test_Class1() { string _TXResult; _TXResult = "if you can read this, the test was successful!"; return _TXResult; } } }
C++ Anwendung:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#include <tchar.h> #include <iostream> #import "I:\\Projekte\\0.1\\dBaseDotNet\\dBaseDotNet\\bin\\Debug\\dBaseDotNet.tlb" raw_interfaces_only //using namespace dBaseDotNet; int _tmain(int argc, _TCHAR* argv[]) { // Initialize COM. HRESULT hr = CoInitialize(NULL); // Create the interface pointer. dBaseDotNet::Class1Ptr ptr(__uuidof(dBaseDotNet::Class1)); BSTR lResult; ptr->Test_Class1(&lResult); std::cout << "The result is " << lResult; // Uninitialize COM. CoUninitialize(); return 0; }
-
Die Methode "Test_Class1" hat doch garkeine Parameter, oder verstehe ich den Aufruf "ptr->Test_Class1(&lResult);" falsch?
-
-
http://kallup.part-time-scientists.com/b1.jpg
> dBaseDotNetTest.exe!_com_ptr_t<_com_IIID<dBaseDotNet::Class1,&_GUID_833e4d56_ab4c_35fc_8570_bcf598f2 d1a1> >::_com_ptr_t<_com_IIID<dBaseDotNet::Class1,&_GUID_833e4d56_ab4c_35fc_8570_bcf598f2d1a1> >(_GUID& clsid = {...}, IUnknown* pOuter = <Nicht definierter Wert>, unsigned int dwClsContext = 7) Zeile 198 C++
-
Wie du siehst hat CreateInstance ein fehlerhaftes HRESULT zurückgegeben, was ist denn das für eines?
-
Code :
1 2 3 4 5
// Initialize COM. HRESULT hr = CoInitialize(0); if (hr == S_OK) cout << "init: ok" << endl; else if (hr == S_FALSE) cout << "already init" << endl; cout << "weiter: " << hr << endl;
init ok wird erst garnicht angezeigt
und weiter: ergibt negativen Wert -21,,,,,
-
Ich meinte dabei eher im Debugger, CoInitialize gibt in deinem Fall RPC_E_CHANGED_MODE zurück, da bereits vorher auf ein anderen Threadingmodell CoInitialize verwendet wurde. Was ist denn das HRESULT von CreateInstance im Debugger? Und was ist der ganze Text der Exception?
PS:
Wenn es einen negativen Wert ergibt, dann wärs besser den auch hinzuschreiben, nämlich -2147417850. Mit -21....... kann man nichts anfangen.
-
> dBaseDotNetTest.exe!_com_ptr_t<_com_IIID<dBaseDotNet::Class1,&_GUID_833e4d56_ab4c_35fc_8570_bcf598f2 d1a1> >::_com_ptr_t<_com_IIID<dBaseDotNet::Class1,&_GUID_833e4d56_ab4c_35fc_8570_bcf598f2d1a1> >(_GUID& clsid = {...}, IUnknown* pOuter = <Nicht definierter Wert>, unsigned int dwClsContext = 7) Zeile 198 C++
comip.h:
Code :1 2 3 4 5 6 7 8 9 10 11
// Calls CoCreateClass with the provided CLSID. // explicit _com_ptr_t(const CLSID& clsid, IUnknown* pOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) : m_pInterface(NULL) { HRESULT hr = CreateInstance(clsid, pOuter, dwClsContext); if (FAILED(hr) && (hr != E_NOINTERFACE)) { _com_issue_error(hr); } }
-
Zum dritten Mal: Was ist der Wert von hr? Das ist ja das, was es ausmacht!
-
-2147417850
-
Das ist das, was dir CoInitialize zurückgibt, oder?
-
ja, richtig
-
Eben, daher jetzt zum vierten Mal, was ist zeigt dir der Debugger als Rückgabewert von dieser Zeile an:
Code cpp:1
HRESULT hr = CreateInstance(clsid, pOuter, dwClsContext);
-
hr = -2147221164
-
Habe den Code ein wenig geändert, aber der Block wird nicht abgearbeitet - init false ...
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
#include <tchar.h> #include <Objbase.h> #include <iostream> #pragma comment(lib, "Ole32") #import "I:\\Projekte\\0.1\\dBaseDotNet\\dBaseDotNet\\bin\\Debug\\dBaseDotNet.tlb" no_namespace //raw_interfaces_only using namespace std; int main(int argc, char** argv) { HRESULT hr = CoInitialize(NULL); if (SUCCEEDED(hr)) { cout << "init: ok" << endl; try { Class1Ptr p(__uuidof(Class1)); cout << "The result is: " << p->Test_Class1(); } catch (...) { cout << "Error" << endl; } CoUninitialize(); } else cout << "init false" << endl; return 0; }
Ähnliche Themen
-
C# - Kann eine Klasse sich selbst an eine andere übergeben?
Von Aero13 im Forum .NET DatenverwaltungAntworten: 2Letzter Beitrag: 12.01.11, 15:23 -
Wie kann man Variablenwerte der main-Klasse in eine Unterklasse übrgeben?
Von Migelito im Forum JavaAntworten: 16Letzter Beitrag: 15.06.10, 08:29 -
Wie kann ich in eine Java Klasse mit XML steuern ?
Von kreez im Forum Java GrundlagenAntworten: 3Letzter Beitrag: 15.06.09, 12:01 -
Eine Klasse in meinem Programm verwenden (Netbeans)
Von Andre_Java im Forum JavaAntworten: 2Letzter Beitrag: 16.11.07, 09:11 -
Kann ich eine Illustrator-Datei als Material verwenden?
Von S_Golem im Forum Cinema 4DAntworten: 2Letzter Beitrag: 26.10.06, 11:39





Zitieren


Login





