Newsgroup: it.comp.lang.c++
Titolo: Una richiesta su IDL!!!

Ciao a tutti,
sembra una richiesta stupida, ma c'č qualcuno che mi sa indicare un esempio
di come prototipare una funzione in un IDL file che deve prendere in input
un const char* e restituirmi un char*.
Io ho implementato la mia in questo modo ma mi sta creando non pochi
problemi:
HRESULT duplicateDC([in, string] LPCSTR key, [in, string] LPCSTR keywords,
[out, string, retval] RIS outval);
La mia conoscenza sugli IDL file č prossima allo zero e anche se mi indicate
qualche reference dove andare a vedere va bene lo stesso.
Grazie e a buon lavoro a tutti.:-)
Matteo

qualche reference dove andare a vedere va bene lo stesso.
La documentazione in linea del VC++ include quella del linguaggio
IDL e del relativo compilatore MIDL.  Puoi anche scaricarti strumenti
e doc dalla rete come parte del "Platform SDK" per Windows, dal
sito Microsoft.
Secondo me, la migliore documentazione in assoluto sulle varie
complessita` dei protocolli COM relative alla gestione di memoria
in strutture complesse, regole di marshaling, eccetera, e` nel
libro di Don Box, "Essential COM" (solo in inglese, temo).
Alex

Non sapendo cosa sia un RIS, trovo difficile supportarti.
Grazie per il  suggerimento, però per la mia incapacità sull'argomento,
necessito ulteriore supporto. :-)
Cercherò di spiegarvi meglio il mio problema.
Io devo creare un DCOM Server attraverso il quale richiamare funzioni
contenute in una DLL.
Questo ovviamente non è il problema ma sto veramente diventando matto per
cercare di capire come gestire i parametri da passare a queste funzioni.
Vi porto l'esempio che mi crea piu' problemi:
Il mio DCOM server deve chiamare una funzione che prende come parametri due
const char* e mi deve restituire un char*
Es.
char* funz (const char*, const char*);
Sulla base di questo ho definito  cosi' l'IDL file:
.......
 interface IServerObj : IDispatch
 {
  typedef [size_is(25)] LPSTR RIS;
    HRESULT funz([in] LPCSTR , [in] LPCSTR , [out, retval] RIS outval);
 };
........
Automaticamente il VC5.0 mi crea i ripettivi di questa funzione nell'header
file e nel source.
Header file:
STDMETHOD(funz)(LPCSTR key, LPCSTR keywords, RIS outval);
Source file:
STDMETHODIMP CServerObj::funz(LPCSTR key, LPCSTR keywords, RIS outval)
{
 outval = funz_DLL(key, keywords);
 return S_OK;
}
**************************************
Lato client questo è il modo in cui richiamo la funzione:
LPTSTR ritorno;
CString  m_setkey;
CString m_setkeywords;
   hRes = m_pIServerObj->funz((const char*)m_setkey,
             (const char*)m_setkeywords,
             ritorno);
Questo è quello che ho fatto ma non ne vuole sapere di funzionare.
Sapete darmi una ulteriore dritta per cercare di uscire da questo buco nero
in cui mi trovo?
Grazie a tutti in anticipo e buon lavoro.
Matteo

in cui mi trovo?
Te ne ho gia` date varie nell'ultimo mio messaggio su questo thread,
cui ora replichi, e non mi pare che delle dritte in questione tu abbia
tenuto il minimo conto nel codice che ora posti, per cui, ti consiglio
di leggerlo (o rileggerlo) e metterlo in pratica, dritta per dritta per
tre e quattordici: se vuoi "tornare un char*" il tuo parametro [out,
retval] dev'essere di tipo char** (come ho scritto in quel messaggio,
e tu non hai fatto nel codice che posti) -- per un parametro [out] la
memoria dev'essere allocata dal chiamato con CoTaskMemAlloc
(che tu non chiami) e liberata dal chiamante con CoTaskMemFree
(che tu non chiami) -- e cosi` via.
Alex

libro di Don Box, "Essential COM" (solo in inglese, temo).
Amen (e meglio che sia solo in inglese, non oso pensare come verrebbero
tradotti "marshaling" o "inter-apartment threading" :).
A parte quello e l'upcoming "Effective COM", tutto quello che produce Wrox
Press riguardo COM/ATL/MTS e' eccellente. 
Davide Marcato.
----------------------------------------------------
| -- Freelance International Consultant
| -- Win32/MFC/COM Development & Training
| -- Technical Writer & Speaker
----------------------------------------------------
| -- Email: 
mar...@programmers.net
| -- Web: 
http://www.DavideMarcato.com
----------------------------------------------------