[ TheAlas @ 07.12.2004. 19:19 ] @
Kako da dodam property "DataSource" u svoju ActiveX kontrolu, trebalo bi znaci da bude cRecordSet odnosno RecordSet tipa?
99% data aware kontrola za vb su pisane u cppu, tako da sumnjam da ne moze, kao sto recimo DataGrid ima DataSource...
Automatizacija u msvcpp-u podrzava samo neke osnovne tipove podataka... kako da dodam klasu "DataSource", ili recimo kolekciju klasa "Columns" i sl. ?
Pitanje je mozda opsirno, pocetnik sam sa activex objektima u c++-u ...
[ milanche @ 08.12.2004. 01:56 ] @
Daj malo vise detalja o tome sta tacno pokusavas da uradis.
[ TheAlas @ 08.12.2004. 11:42 ] @
Radi se o ATL kontroli zapravo koja ce biti koriscena u visual vasic 6 okruzenju. Naime, meni je potrebno da dodam property DataSource u svoju kontrolu, ali to je izuzetno tesko jer ATL (c++ uopste) ima nikakvu podrsku za ADO (COM-bazirana komponenta). Znaci trebam da koristim klasu "Recordset" iz biblioteke msado25.tlb, ta klasa povezuje okruzenje (vb6 u ovom slucaju) i kontrolu preko "DataSource" svojstva, jer preko te klase vadim podatke iz sql upita, tabele, itd.

Znam samo da trebam da da importujem ado biblioteku:

importlib("C:\Program Files\Common Files\System\ADO\MSADO25.TLB");

i da popravim neke probleme sa imenima:
#import "C:\Program Files\Common Files\System\ADO\MSADO25.TLB" rename_namespace("ADOPrimer") rename("EOF","EndOfFile")
using namespace ADOPrimer;

Ali posto nema nikakve dokumentacije za koriscenje ADO-a u c++-u, logicno da nemam pojma kako se koriste .

Da stvar bude jos gora, pocetnik sam sa kompleksnim klasama u cppu (nikad mi nisu trebale klase, a ni COM objekti), pa ne znam ni kako se koriste one QueryInterface i AddRef funkcije (ne znam ni cemu sluze, ali compiler mi izbacuje da su "vitalne" )

Evo, ako pomaze, kako izgleda taj property (koji ne sluzi nicemu jer ne znam kako da koristim prokletu klasu):

[propget, id(1), helpstring("property DataSource")] HRESULT DataSource([out, retval] _Recordset **pVal);
[propput, id(1), helpstring("property DataSource")] HRESULT DataSource([in] _Recordset* newVal);

Code ovih svojstava u vbu izgleda ovako:

Code:

Public Property Get DataSource() As ADODB.Recordset
   Set DataSource = mvarDataSource
End Property

Public Property Let DataSource(ByVal vNewValue As ADODB.Recordset)
   Set mvarDataSource = vNewValue
   PropertyChanged "DataSource"
End Property


Meni treba isto u cppu, ali ovaj _Recordset ne podrzava New keyword, ne znam ni kako da je kreiram (uvek je prazna, ne sluzi nicemu).

Probao sam ovo, ali opet isto (sto je i logicno):

Code:

STDMETHODIMP CDataGridCtrl::get_DataSource(_Recordset **pVal)
{
    // TODO: Add your implementation code here
    CoInitialize (NULL);

    pVal = &m_DataSource;
    
    CoUninitialize ();
    return S_OK;
}

STDMETHODIMP CDataGridCtrl::put_DataSource(_Recordset *newVal)
{
    // TODO: Add your implementation code here
    CoInitialize (NULL);

    m_DataSource = newVal;

    CoUninitialize ();
    return S_OK;
}
[ TheAlas @ 08.12.2004. 11:46 ] @
U vbu kada koristim kontrolu:

Code:

Option Explicit

Private DB As New ADODB.Connection

Private Sub Form_Load()
   Dim r&, c&, strDataBaseFile$
   
   strDataBaseFile = App.Path & "\sim_trade97.mdb"
   DB.Open "Driver={Microsoft Access Driver (*.mdb)};Dbq=" & strDataBaseFile & ";DefaultDir=" & App.Path & ";"
   
   With Grid
      
      .DataSource = DB.Execute("SELECT * FROM tblRoba")

      If (.DataSource Is Nothing) Then MsgBox "Opet nista": GoTo e
      .DataSource.MoveFirst
      Debug.Print .DataSource.Fields(0).Value
e:
   End With
End Sub


Uvek mi javlja "Opet nista" ...

Taj Grid je zapravo ta ATL kontrola, radi se o nekoj primitivnoj tabeli .
[ TheAlas @ 08.12.2004. 14:17 ] @
Uspeo sam da otvorim ADO Recordset u ATL kontroli, posle 4 sata intezivnog mucenja i maltretiranja.
Sada je problem sledeci, kompilacijom konfiguracije "Release Minimum Size" javlja error:

Creating library ReleaseMinSize/DataGrid.lib and object ReleaseMinSize/DataGrid.exp
LIBCMT.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
ReleaseMinSize/DataGrid.dll : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

Zbog OVOG:
Code:

m_DataSource->MoveFirst ();


Klasa ne moze da se koristi u release verzijama :S... videcu sta je problem, ali glavni problem je u sustini resen :P.

Necu vise postovati u ovom topicu dok neko ne odgovori.


Pa zar je moguce da niko ziv ne zna kako se koristi ADO u c++-u???? VB je za baze podataka kralj, cak ni jedan c++ nije bolji za to (msvcpp ne samo da je nemoguce zakomplikovan, nego je jednostavno losiji i cak sporiji od vba... ado je izgleda vb-only >:( ).

[ milanche @ 08.12.2004. 15:36 ] @
Na brzinu (jutro pre odlaska na posao):

Nisam nista radio sa ADO, ali sam sa ActiveX proveo dosta vremena. Nesto ti sigurno
mogu pomoci, sacekaj da (kasnije tokom dana) pogledam detaljnije ovaj tvoj opis
problema.
[ _Super_Ellite_Bug_ @ 08.12.2004. 18:06 ] @
Pozdrav,
ima ljudi koji se razumeju u ADO istale Micro$oft-ove Frankenstajne, ali tebi to ne resava problem, osim da ti dam gotov kod.

Postoji razlika izmedju COM tehnologije i ActiveX tehnologije.
ActiveX jeste COM ali COM nije uvek ActiveX jer je COM temelj na kome je nastao ActiveX ali i druge tehnologije.

QueryInterface() i cemu sluzi
------------------
Veoma prosta stvar:
COM objekti mogu da imaju vise interfejsa.
Na pocetku imas jedan inicijanli pointer na neki od specifiranih interfejsa.Da bi pristupio nekom drugom interface-u treba ti mehanizmom QueryInterface() koji je metoda IUnknown interfejsa da bi kao resultat dobio pointer na novi interfejs.

AddRef() i cemu sluzi:
--------------------
AddRef je druga od tri metode IUnknown interface-a i to je najprostije receno brojac referenci na interface(s) datog objekta.

OK, idemo dalje...
To sto ti treba je rasuto u par knjiga tako da je jako tesko da ti pomognem
tako sto su ti reci sta da radis, sve dok ne budes potpuno razumeo sta se tu desava. Dok ne ovladas malo bolje svim tim u MS C++--, ali mogu da te uputim.
To sto si zamislio je OK, ali radis na pogresan nacin.
Evo linka za primer necega slicnog stim sto se ne koristi ADO, ali razlika je samo u inteface-ima.
http://www.codeguru.com/Cpp/CO...ex/controls/article.php/c2659/
Izanaliziraj ovaj kod i vec ce ti puno stvari biti jasnije, bar za pocetak.O ADO tehnologiji imas prilicno tekstova na netu a i knjiga tako da me cudi da nista nisi pronasao.
Srecno i samo napred. Kad ponovo zapne a ti se javi.





[ TheAlas @ 08.12.2004. 19:31 ] @
Ok, sada su mi bar neke misterije jasnije , _Super_Ellite_Bug_ mi je objasnio (koliko moze za moj nivo znanja) te com-specific funkcije.
Znam nesto osnovno o COM objektima, pravio sam ActiveX objekte u visual basicu. Sto se literature tice, jedina "savremena" kniga koju sam procitao je "Microsoft Visual C++ Biblija" za msvcpp 5.0, u njoj ima nesto malo o com/activex tehnologiji.

Dobar je taj DAO (data access objects) primer, ali dao je star i vise se ne koristi jer ne moze da se update-uje, i bugovi su popravljeni u novom ADO-u (activex data objects). C++ 5 i 6 podrzavaju DAO, ODBS i SQL Server (t-sql zapravo), ali ne i ADO, na msdnu jos nema dokumentacije za c++, samo za vb/asp. Na internetu sam trazio dosta, ali svi imaju isti problem i zaobilaze te komplikacije kao sto radi ovaj dao primer, preko sql drajvera najcesce (sql sintaksa je uvek ista).

Nasao sam i neke artikle koji objasnjavaju koriscenje msado15.dll-a.

Pa, ako iko pozeli da koristi ADO u cppu, evo kako se to radi na najlaksi nacin:

1.) Prvo se importuje dll (u stdafx.h ako je afx prisutan, ili mfc):

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" rename_namespace("ADOCust")
rename("EOF","EndOfFile")
using namespace ADOCust;

Mora se zameniti EOF jer vec postoji, "ADOCust" nije potreban, moze i ovako:

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")

Isto mora i sa importlib ako je u pitanju ATL kontrola, a i mora da se ukloni _ATL_MIN_CRT preprocesorska definicija u release verziji.

2.) Lista klasa:
_Connection, _ConnectionPtr
_Recordset, _RecordsetPtr

(Ptr=pointer)

Evo nekih primera :
Otvaranje konekcije:
Code:

pConnection->Open(strConectIt, "", "", 
adConnectUnspecified);

Ovo je samo primer, ali isto je kao u vbu.

Otvaranje tabele/pogleda, itd:
Code:

pRecordset->Open(commandString, strConectIt, 
adOpenStatic, adLockReadOnly, adCmdText);


Otvaranje polja:
Code:

my_String = _strdup((char*) ((_bstr_t)(pRecordset->GetFields()->
GetItem("ImePolja")->GetValue())) );

my_String je LPCSTR, a ADO daje/trazi samo BSTR odnosno _bstr_t, pa ih treba konvertovati, jer je nemoguce obradjivati BSTR (mada postoje osnovne funkcije).
_strdup je simpaticna funkcija iz win98, pa nece raditi u starijim verzijama, ja je cesto koristim na mesto strcpy :P.

Ovako moze da se koristi ADO bez (vecih) problema, a ja se sada vracam na osnove COM odnosno ActiveX programiranja.