tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
20
ZUGRIFFE
917
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    jkallup jkallup ist offline Mitglied Bronze
    Registriert seit
    Sep 2004
    Beiträge
    43
    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;
    }
     

  2. #2
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Die Methode "Test_Class1" hat doch garkeine Parameter, oder verstehe ich den Aufruf "ptr->Test_Class1(&lResult);" falsch?
     

  3. #3
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Zitat Zitat von CPoly Beitrag anzeigen
    Die Methode "Test_Class1" hat doch garkeine Parameter, oder verstehe ich den Aufruf "ptr->Test_Class1(&lResult);" falsch?
    COM-Funktionen von Windows geben immer HRESULT zurück um Fehler anzuzeigen. andere Rückgabewerte werden als [Out]-Parameter verwendet.

    @OP:
    was meint denn der Debugger dazu?
     

  4. #4
    jkallup jkallup ist offline Mitglied Bronze
    Registriert seit
    Sep 2004
    Beiträge
    43
    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++
     

  5. #5
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Wie du siehst hat CreateInstance ein fehlerhaftes HRESULT zurückgegeben, was ist denn das für eines?
     

  6. #6
    jkallup jkallup ist offline Mitglied Bronze
    Registriert seit
    Sep 2004
    Beiträge
    43
    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,,,,,
     

  7. #7
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    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.
     

  8. #8
    jkallup jkallup ist offline Mitglied Bronze
    Registriert seit
    Sep 2004
    Beiträge
    43
    > 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);
                }
            }
     

  9. #9
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Zum dritten Mal: Was ist der Wert von hr? Das ist ja das, was es ausmacht!
     

  10. #10
    jkallup jkallup ist offline Mitglied Bronze
    Registriert seit
    Sep 2004
    Beiträge
    43
    -2147417850
     

  11. #11
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Das ist das, was dir CoInitialize zurückgibt, oder?
     

  12. #12
    jkallup jkallup ist offline Mitglied Bronze
    Registriert seit
    Sep 2004
    Beiträge
    43
    ja, richtig
     

  13. #13
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    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);
     

  14. #14
    jkallup jkallup ist offline Mitglied Bronze
    Registriert seit
    Sep 2004
    Beiträge
    43
    hr = -2147221164
     

  15. #15
    jkallup jkallup ist offline Mitglied Bronze
    Registriert seit
    Sep 2004
    Beiträge
    43
    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

  1. C# - Kann eine Klasse sich selbst an eine andere übergeben?
    Von Aero13 im Forum .NET Datenverwaltung
    Antworten: 2
    Letzter Beitrag: 12.01.11, 15:23
  2. Antworten: 16
    Letzter Beitrag: 15.06.10, 08:29
  3. Wie kann ich in eine Java Klasse mit XML steuern ?
    Von kreez im Forum Java Grundlagen
    Antworten: 3
    Letzter Beitrag: 15.06.09, 12:01
  4. Antworten: 2
    Letzter Beitrag: 16.11.07, 09:11
  5. Antworten: 2
    Letzter Beitrag: 26.10.06, 11:39

Stichworte