Wie kann ich eine C# Klasse in C++ verwenden? Programm crasht :-(

jkallup

Erfahrenes Mitglied
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:
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:
#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?
 
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?
 
http://kallup.part-time-scientists.com/b1.jpg

> dBaseDotNetTest.exe!_com_ptr_t<_com_IIID<dBaseDotNet::Class1,&_GUID_833e4d56_ab4c_35fc_8570_bcf598f2d1a1> >::_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:
    // 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_bcf598f2d1a1> >::_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:
    // 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);
			}
		}
 

Neue Beiträge

Zurück