Ich versuche C# -Code aus C++ aufzurufen. Also habe ich den COM-Interop-Weg gewählt. Jetzt habe ich C# -Code:C# von C++ aufrufen, Rückgabewert
namespace ToBeCalled
{
[Guid("9329feaf-b293-4093-a7d8-6128f52b30a6")]
[ComVisible(true)]
public interface IInterface
{
int Write(string toWrite);
}
}
namespace ToBeCalled
{
[Guid("e4105e40-2d6b-4b7c-ae42-d2f9c405a2a0")]
[ComVisible(true)]
public class ClassYouWantToUse : IInterface
{
public int Write(string toWrite)
{
System.Console.WriteLine(toWrite);
return 1;
}
}
}
und C++ Code
#import "...\\ToBeCalled.tlb"
int _tmain(int argc, _TCHAR* argv[])
{
// Initialize COM.
HRESULT hr = CoInitialize(NULL);
// Create the interface pointer.
ToBeCalled::IInterfacePtr piTest(__uuidof(ToBeCalled::ClassYouWantToUse));
long lResult = 0;
// Call the Add method.
piTest->Write("hi", &lResult);
wprintf(L"The result is %d\n", lResult);
// Uninitialize COM.
CoUninitialize();
return 0;
}
Wenn ich diese Kompilierung versuchen, natürlich heißt es, dass Schreiben nicht zwei Argumente nimmt. Ich habe die MSDN gesehen, wo sie ein Beispiel haben, und sie nehmen den Rückgabewert auf diese Weise. Meine Frage ist also, wie kann ich den Rückgabewert der Funktion erhalten? Wenn ich den Anruf auf
aktualisiert, dann schlägt die Ausführung fehl bei Unhandled Exception. Wenn ich dieses Beispiel versuchte, ohne Wert zurückzugeben, so ist die Deklaration des Rückgabewerts für Methode ungültig, als alles in Ordnung funktioniert.
Ich fand, dass es notwendig ist, Parameter zu C# hinzuzufügen, und dann kann ich das zweite Argument verwenden, das den Ergebniswert haben wird. Ok, also für Int ist das Problem gelöst, aber wie kann ich die Zeichenfolge so senden? –
Normalerweise sollte es möglich sein, einen Wert zurückzugeben, und nicht über den Parameter "[out]". Was ist genau die Ausnahme? Haben Sie den verwalteten Anruf bereinigt? –