PDA

Visualizza la versione completa : [C++] Leggere dei valori interi da un oggetto COM scritto in C#


trancegate
14-05-2007, 11:00
Vorrei usare una COM scritta in C# da un client CGI scritto in C++.
Ho implementato già istanziamento, importazione della libreria di tipi e chiamate a funzione, ma non riesco a farmi tornare valori dalla COM.
Esiste la possibilità di fare questo?
Siccome le chiamate ad una funzione COM tornano un tipo HRESULT, non è possibile farsi tornare direttamente i valori di ritorno dalle chiamate.. no?
Ho già provato a specificare i valori di rotirno come proprietà della classe nella COM, e li ho definiti nella sua interfaccia, ma se da CGI faccio una printf di quel valore, che è un intero, mi stampa sempre 74mila e qualcosa...
Qualcuno di voi mi sa dare qualche indicazione?

oregon
14-05-2007, 11:16
Intanto COM non e' un linguaggio ... dovresti indicare che lavori in C++ ...

In secondo luogo, se non mostri nulla del codice, e' praticamente impossibile darti qualche suggerimento ...

trancegate
14-05-2007, 12:05
Non credo sia così impossibile cominciare a dare qualche suggerimento, siccome la mia domanda era...
E' possibile leggere dei valori di ritorno da un oggetto COM?? se si.. come?
Comunque metto un pò di codice.

Questo è il codice della COM, scritta in C#, che vi ho semplificato al massimo:


using System;
using System.Runtime.InteropServices;

namespace OSNETDBInterface
{
[GuidAttribute("E1362857-D6CC-4541-8971-61CC776ADF83")]

public interface IDbInterface
{
uint nCols
{
get;
}
ulong nRows
{
get;
}

}
[ClassInterface(ClassInterfaceType.None)]
public class DbInterface : IDbInterface
{
private uint _nCols=0;
private ulong _nRows=0;

public uint nCols
{
get{return _nCols;}
}
public ulong nRows
{
get{return _nRows;}
}


public DbInterface()
{
_nCols=5;
_nRows = 35000;
}
}
}


Da C++, tenendo conto che ho già istanziato l'oggetto, e che ho ottenuto il puntatore alla sua interfaccia:


//prtDb è il puntatore all'interfaccia
printf("(DB Module)ptrDB->nRows %d", ptrDB->nRows);
printf("(DB Module)ptrDB->nCols %d", ptrDB->nCols);


L'output delle printf è sempre una stesso valore numerico, e non corrisponde ai valori assegnati nel costruttore.

oregon
14-05-2007, 12:37
Originariamente inviato da trancegate
Non credo sia così impossibile cominciare a dare qualche suggerimento

Scusa ... non vedo il perche' di questa precisazione, se non per puro spirito polemico rispetto a chi, comunque ti risponde e vuole i chiarimenti che ritiene necessari per darti un aiuto ...

Infatti, nel caso della tua domanda, le risposte potevano essere ...



siccome la mia domanda era...
E' possibile leggere dei valori di ritorno da un oggetto COM??

Sì ...



se si.. come?

"Istanziando l'oggetto e usando il puntatore alla sua interfaccia per accedere ai suoi membri" ...

E non penso ti sarebbe servito a molto ...



Comunque metto un pò di codice.

Bontà tua ...



Questo è il codice della COM, scritta in C# ...

Da C++, tenendo conto che ho già istanziato l'oggetto, e che ho ottenuto il puntatore alla sua interfaccia ...


A questo punto, completa il codice proponendo come hai istanziato l'oggetto e come hai ottenuto il puntatore, cosi' che si possa fare un copia-incolla del codice per fare dei test "veloci" dato che il tempo non basta mai ...

Ovviamente, se sei d'accordo ...

trancegate
14-05-2007, 15:35
Da C++ istanzio la COM in questo modo:



int DBInitialize ()
{
IDbInterfacePtr ptrDB = NULL;
HRESULT hr=NULL;

try
{
hr = ptrDB.CreateInstance (L"OSNETDBInterface.DBInterface");

if (FAILED (hr)){
_com_raise_error (hr);
DEBUG_OPEN("%s","(DB Module) Initialization COM failed");
}
ptrDB->Init(configIDInstance);

DEBUG_OPEN("%s","(DB Module) Initialization COM successfull");


}
catch (_com_error &e) {

strMessage.Format ("(DBInitialize) Caught COM Error: " \
"(HRESULT Code) %08lx - (Win32 code meaning) %s - (Description) %s - ",
e.Error (),
e.ErrorMessage (),
e.Description ());
DEBUG_OPEN ("%s", strMessage.GetBuffer (0));


}

Loading