Newsgroup: it.comp.lang.visual-basic
Titolo: [OT] Passaggio di dati Da VB verso C++ utilizzando tecnologia COM

Salve a tutti , sono in un punto morto.
Ho creato in VC++ una DLL/AX con interfaccia COM
Mi serve perchè in VB mi mancano alcune funzionalità che posso recuperare da
altre librerie in C++.
Adesso mi serve passare invece che solo una stringa, un array di stringhe,
Finche era solo una stringa, bastava dare all'IDL:
BST *stringaDaPassare
e me l'accettava.
Ma per un array di stringhe non ho trovato niente. Ho provato anche VARIANT,
me lo accetta, ma poi all'interno è tutto vuoto!
Qualcuno ha già avuto un problema simile?
Grazie!
Maverick

me lo accetta, ma poi all'interno è tutto vuoto!
Mumble mumble, se vuoi passare un array di stringhe in entrata e
uscita dovrebbe funzionarti facendo come in questo esempio:
HRESULT Prova(
	[in, out] SAFEARRAY(BSTR)* a_StrArray, 
	[out, retval] long* );
    };
-- 
ciao, hal

 ciao, hal
Grazie Hal, sono sicuro che quello che hai detto è giusto, ma ho ancora
qualche problema.
Ovviamente inserisco il tuo suggerimento è mi da errore dicendo che
sull'header della classe che implementa il wrapper Com non
trova la struttura tagSAFEARRAY, allora prendo l'MSDN e cerco... cerco...
cerco e trovo una pagina che mi dice che posso trovare tutte le strutture
e le funzioni tra cui questi SAFEARRAY in:
Oleauto.h e oleaut32.lib
Allora inserisco nel settings la libreria lib e metto nell'header l'import
dell'oleauto.h
Niente, l'errore non cambia, continua a non trovarmi stò tagSAFEARRAY.
Ho provato anche a cercare su google ma mi dicono tutti di mettere #include
"oaidl.h" ma il risultato non cambia
Ovviamente ho anche guardato dentro questi headers ed effettivamente le
dichiarazioni ci sono.
Bo, provo a postare un po' di codice sperando che qualcuno veda l'inghippo.
Interfaccia IDL
 [
  object,
  uuid(7E26ECBF-1B36-11D8-81F7-000629EE42B3),
  dual,
  helpstring("IStrArray Interface"),
  pointer_default(unique)
 ]
 interface IStrArray : IDispatch
 {
  [id(1), helpstring("method prov")] HRESULT prov([in,out] SAFEARRAY(BSTR)*
pipp);
 };
Header
// StrArray.h : Declaration of the CStrArray
#ifndef __STRARRAY_H_
#define __STRARRAY_H_
#include "resource.h"       // main symbols
#include "oleauto.h"
#include "oaidl.h"
////////////////////////////////////////////////////////////////////////////
/
// CStrArray
class ATL_NO_VTABLE CStrArray :
 public CComObjectRootEx<CComSingleThreadModel>,
// public CComCoClass<CStrArray, &CLSID_StrArray>,
 public IDispatchImpl<IStrArray, &IID_IStrArray, &LIBID_SystechTOPOLOGYLib>
{
public:
 CStrArray()
 {
 }
DECLARE_REGISTRY_RESOURCEID(IDR_STRARRAY)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CStrArray)
 COM_INTERFACE_ENTRY(IStrArray)
 COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
// IStrArray
public:
 STDMETHOD(prov)(/*[in]*/ SAFEARRAY(BSTR)* pipp);    <-- riga //***// (vedi
sotto)
};
#endif //__STRARRAY_H_
Implementazione
// StrArray.cpp : Implementation of CStrArray
#include "stdafx.h"
#include "Topology.h"
#include "StrArray.h"
////////////////////////////////////////////////////////////////////////////
/
// CStrArray
STDMETHODIMP CStrArray::prov(SAFEARRAY(BSTR)* pipp)
{
 // TODO: Add your implementation code here
 return S_OK;
}
Errori in compilazione:
--------------------Configuration: Topology - Win32
Debug--------------------
Compiling...
StrArray.cpp
f:\sorgenti\enel\topology\strarray.h(33) : error C2061: syntax error :
identifier 'tagSAFEARRAY' <-- Questo errore si riferisce alla riga //***//
F:\Sorgenti\Enel\Topology\StrArray.cpp(9) : error C2275: 'BSTR' : illegal
use of this type as an expression
        c:\program files\microsoft visual studio\vc98\mfc\include\afx.h(352)
: see declaration of 'BSTR'
F:\Sorgenti\Enel\Topology\StrArray.cpp(9) : error C2440: 'type cast' :
cannot convert from 'unsigned short *' to 'struct tagSAFEARRAY'
        No constructor could take the source type, or constructor overload
resolution was ambiguous
F:\Sorgenti\Enel\Topology\StrArray.cpp(9) : error C2065: 'pipp' : undeclared
identifier
F:\Sorgenti\Enel\Topology\StrArray.cpp(10) : error C2448: '<Unknown>' :
function-style initializer appears to be a function definition
Topology.cpp
f:\sorgenti\enel\topology\strarray.h(33) : error C2061: syntax error :
identifier 'tagSAFEARRAY'
Generating Code...
Error executing cl.exe.
Creating browse info file...
SystechTopology.arx - 6 error(s), 0 warning(s)
Grazie in anticipo!
Maverick

 Maverick
Andrea


Ammetto che ci avevo già pensato anche io, ma ho fatto qualche ricerca su
splittatori automatici come per la funzione Split di visual basic in C++ è
non ho trovato niente di soddisfacente, ora non è che sono svogliato, ma
sono stufo di fare il ragionamento: "mi rifaccio tutto" perchè sono sicuro
che queste cose in giro ci sono già.
Ma oltretutto non crescero mai tecnicamente se continuo ad usare quello che
conosco già per rifare il resto. Esiste stò benedetto COM, è maledettamente
scerante da far funzionare in VC++ ma se sono riuscito partendo da 0 a farmi
la mia DLL/AX e a gestire valori e stringhe, cavolo adesso devo trovare il
modo di passare array e da li in futuro passarmi classi create da me ecc...
in quel modo riuscirò a diventare + produttivo e limiterò i miei limiti.
(eheheh)
Quando quel giorno arriverà sono sicuro che cambierà Windows e VB e il COM
non saranno + utilizzabili e io me la sarò presa gentilmente nel c...
.....
speriamo non accada mai! :-<
Ciao
Maverick

 Maverick
Andrea

 Se lo trovo in giro, ci darò un'occhiata, grazie
Su Amazon sicuramente trovi.
Ciao,
Andrea


Dunque, voglio chiarirmi alcune cose:
1- COM. Non è una tecnologia nata per standardizzare il passaggio di
infirmazioni, chiamate tra vari applicativi fatti con linguaggi anche
diversi?
2- ATL. Per cosa stà ? Active template Library cioè Libreria di modelli per
la creazione di oggetti ActiveX
Quindi sbaglio dicendo che in C++ per fare una DLL ActiveX in questo momento
stò usando ATL?
Credo di no, anche perchè fino ad adesso stò inserento "New ATL Object" di
preciso dei "Simple object"
HAL1961 mi aveva dato una risposta che mi ha avvicinato di moltissimo al mio
problema, ma ho ancora degli errori che non riesco a capire.
Non penso che Hal1961 si sia inventato tutto, se ha scritto quella notazione
è perchè da qualche parte l'ha già vista o addirittura lui l'ha già
implementata.
Magari sbaglio, ma mi sembra assurdo di non poter passare Array in COM visto
che VB è tutto fatto in COM.
Capisco che passare classi create da me sia un casino, ma almeno array....
In sostanza ATL è una delle librerie per il C++ fatta apposta per gestire le
chiamate COM, quindi se è vero quel che tu dici, che in COM non posso
passare ARRAY allora non lo posso fare neanche con le ATL, giusto?
Maverick

 Maverick
Andrea

 al mio problema, ma ho ancora degli errori che non riesco a capire.
Riguardo gli errori che ti vengono fuori, la mia sensazione - a pelle - è
che hai
dimenticato di importare qualche type library oppure non hai installato ATL
nel
modo corretto.
Ciao,
Andrea


Ahhhh noooooooo
non voglio passare un array come una stringa.
Voglio da VB passare una stringa e in C++ avere un oggetto (SAFEARRAY) che
mi permetta di gestire i valori contenuti in essa.
Il fatto è che con questa dichiarazione:
STDMETHOD(prov)(/*[in]*/ SAFEARRAY(BSTR)* pipp);
mi da questo errore:
error C2061: syntax error : identifier 'tagSAFEARRAY'
Ma l'header l'ho messo, infatti per prova ho ridichiarato il tipo
tagSafeArray e mi diceva errore: redefinition bla bla bla
Ho guardato l'errore su MSDN è dice:
Compiler Error C2061
syntax error : identifier 'identifier'
The compiler found identifier where it was not expected. This error can be
caused by enclosing an initializer in parentheses. The error can be avoided
by enclosing the declarator in parentheses or making it a typedef. The
following example causes this error and shows two fixes:
...
Ma non capisco ne cosa intende visto che il tagSAFEARRAY è già un typedef e
ne perchè non funziona visto che ho già messo il tipo tra parentesi... bo?
Maverick

 (SAFEARRAY) che mi permetta di gestire i valori contenuti in essa.
Aspettta aspettaaaaaaaaaaaaaaaaaaaa!!!!!!!
Non facciamo confusione: vuoi un array o una stringa?
O cosa?
Andrea

 wrote in message
news:bpl9gv$1pu5e4$1...@ID-170738.news.uni-berlin.de...

Voglio un Array di stringhe!

 wrote in message
news:bplaqr$1psecu$1...@ID-206393.news.uni-berlin.de...

Cacchio, prima ho scritto una cazzata
La frase:
Voglio da VB passare una stringa e in C++ avere un oggetto (SAFEARRAY) che
mi permetta di gestire i valori contenuti in essa.
Invece č
Voglio da VB passare un'array di stringhe e in C++ avere un oggetto


 (SAFEARRAY) che mi permetta di gestire i valori contenuti in essa.
Oh, ok, allora:
1) Controlla che tu abbia importato TUTTE le typelibraries necessarie
2) Controlla che TUTTI i file di inclusione ci siano, compresi quelli
accessori( devi verificare gli IFDEF di tutti i files .h ).
Una volta fatti questi controlli, se non funziona....
Puoi iniziare a piangere! <g>
No, scherzo, magari prova a chiedere su it.comp.programmare.win32 che
stanno lì apposta.
Ciao,
Andrea

 accessori( devi verificare gli IFDEF di tutti i files .h ).
Dunque per quello che ne so mi dicono:
di importare il file
oaidl.h
(comunque ho provato a toglierlo e mi da lo stesso errore, sono andato a
vedere negli altri header ed era già stato messo)
Ho inserito Oleaut32.lib nelle librerie.
Altro non saprei cosa fare.
Se hai qualche altro suggerimento bene, altrimenti mi sposto sull'altro
GRUPPO.
Comunque grazie lo stesso!