[BCB] COM Programming

Pagina: 1
Acties:
  • 193 views sinds 30-01-2008
  • Reageer

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Ik ben bezig om uit te zoeken hoe COM programmeren in zijn werk gaat. Ik ben nu op zoek naar een aantal voorbeelden van COM programmeren en ik dacht een heel mooie tutorial te hebben gevonden:
How To Do COM In C++Builder 5
Hier wordt het principe en werking van COM gedatailleerd uitgelegd en wordt een voorbeeld programmatje van COM gemaakt. En hier gaat het mis. Dit voorbeeld programmatje krijg ik met geen mogelijkheid aan de praat. Als ik het voorbeeldje naamaak dan gaat het fout in de Client (hele source = bovenstaande link):
Deze regel:
TCOMIFoo Foo = new CoFoo::Create();
Geeft deze fout:
[C++ Error] Unit2.cpp(15): E2090 Qualifier 'CoFoo' is not a class or namespace name

Nu ben ik al een hele tijd aan het prutsen om dit aan het werken te krijgen, maar het wil maar niet lukken...

Heeft iemand anders misschien een tutorial die wel werkt? Want eerlijk gezegd is dit de enige tutorial die ik kon vinden die mij goed leek... Of kan iemand mij vertellen wat er fout gaat? In het laatste geval: hou er wel rekening mee dat ik dus nog geen verstand heb COM programmeren en dat het al snel akakadabra wordt voor mij :'(

TNX (i.a.) !

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

heb je de juiste header file (...._TLB.H) waar die CoFoo instaat wel geinclude?

We adore chaos because we like to restore order - M.C. Escher


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Ik heb de server gecompiled en vervolgens geregsistreerd.
Daarna heb ik in de client de TLB inderdaad geinclude:
#include "../COMServer/COMServer_TLB.cpp"

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ik heb niet veel met COM icm BCB gewerkt, maar weet je zeker dat je niet de .h moet includen ipv de cpp? Staat daar ook wel een classe CoFoo met een methode Create in?

COM programmeren met C is over het algemeen lastiger als met talen als Delphi of VB of .Net.

We adore chaos because we like to restore order - M.C. Escher


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Ik heb eigenlijk geen idee of je de cpp of de h moet includen, maar hij doet het met beide niet :'( En ik kan die CoFoo eigenlijk helemaal niet vinden in de server. Ik heb dit programmatje van het voorbeeld in de bovenstaande link overgenomen, en dat werkt al niet. Ik weet niet wat ik moet doen om een werkend geheel te krijgen, dus ik kan eventuele errors niet oplossen, dat ik er geen verstand van heb is juist de reden dat ik het aan het leren ben.

En waarom is het in C++ Builder moeilijker dan in delphi? C++ Builder is toch vrijwel hetzelfde als delphi, alleen met een andere syntax, C++ ipv object pascal? Of zie ik dat verkeerd?

Maar ik weet wel dat ik er gek van wordt dat ik het niet aan de praat kan krijgen, en dat ik kan geen goede of werkende voorbeelden vinden van hoe ik dit moet programmeren, G.V.D.
Een kleine uitleg van welke stappen ik moet ondernemen om bijvoorbeeld een overbekend "hello world!" voorbeeld te maken, is dat al zoveel gevraagd/ zo moeilijk te vinden?

Als er iemand is die een beetje ervaring heeft met COM in BCB, kan die misschien een heeeel snel een klein voorbeeldje maken? Volgens mij duurt dat helemaal niet lang om te maken als je maar weet hoe zoiets werkt, en je zal mij er ongelooflijk mee voort helpen. Ik krijg het alleen namelijk niet voor elkaar :'(

TNX,
B-Man

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Zelf als ik het zou doen/kunnen zou je er nog niet veel me opschieten. COM is gewoon geen lichte materie in C die je met 1 voorbeeldje onder de knie hebt. Delphi en VB regelen veel van de COM details op de achtergrond zodat je je daar geen zorgen over hoeft te maken.

Hier http://www.techvanguards.com/com/ is aardig wat over COM te vinden. Hoofdzakelijk gericht op Delphi, maar ook met enkele BCB voorbeelden. Hier nog een DCOM voorbeeld wat ook hetzelfde werkt voor COM: http://community.borland.com/article/0,1410,23185,00.html. Kijk eens in de boeken die bij je BCB geleverd worden. Daar staan ook voorbeelden in.

[ Voor 1% gewijzigd door LordLarry op 10-04-2003 14:15 . Reden: Letters vallen weg na een punt? ]

We adore chaos because we like to restore order - M.C. Escher


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Ik zal die links eens doorlezen die je me gegeven hebt, ziet er in ieder geval veel belovend uit! Dank je wel voor deze links, ik zal je wel laten weten of het nu lukt of niet...

  • Surehand
  • Registratie: Februari 2003
  • Laatst online: 18-08 15:40
PKP B-Man schreef op 10 april 2003 @ 10:00:

Deze regel:
TCOMIFoo Foo = new CoFoo::Create();
Geeft deze fout:
[C++ Error] Unit2.cpp(15): E2090 Qualifier 'CoFoo' is not a class or namespace name
Probeer het eens zonder 'new'. Je roept een functie aan, geen constructor...

(ook in de link die je zelf opgeeft staat een voorbeeld zonder new)

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Geweldig: als ik het volgens het tweede voorbeeld doe, dan werkt het. En corrigeer me als ik het fout heb, maar ik gebruik COM en niet DCOM omdat ik de CreateRemote vervang door Create.

Alleen weet ik niet wanneer je een Automation Object (File | New | Other | Active X)gebruikt en wanneer een COM Object. Ik heb geen idee wat het verschil is, alleen gebruikt jou voorbeeld automation en dat andere voorbeeld COM.
Automation Object Create a new Automation object. The Automation Object wizard allows you to enter a class name for the new Automation object and set the threading model. Once the wizard creates the Automation object, use the Type Library editor to define the interface it exposes to clients.

COM Object Create a new COM object to implement a registered interface or a new interface that descends from IUnknown. The COM Object wizard allows you to specify the properties of a new COM server.
Maar i.i.g. bedankt voor je links, op naar het volgende probleem :p

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

PKP B-Man schreef op 10 April 2003 @ 15:00:
Geweldig: als ik het volgens het tweede voorbeeld doe, dan werkt het. En corrigeer me als ik het fout heb, maar ik gebruik COM en niet DCOM omdat ik de CreateRemote vervang door Create.
Klopt
Alleen weet ik niet wanneer je een Automation Object (File | New | Other | Active X)gebruikt en wanneer een COM Object. Ik heb geen idee wat het verschil is, alleen gebruikt jou voorbeeld automation en dat andere voorbeeld COM.
Een COM object heeft IUnknown als basis, wat het absolute minimum is voor een COM Object. Een Automation Object heeft IDispatch (die afleid van IUnknown) als basis. Deze interface zorgt ervoor dat late binding mogelijk wordt. Late binding is nodig als je ooit via scripttalen of (vroeger?) VB je COM object wilt laten gebruiken. In veel talen is het geen tot weinig extra werk voor een object om IDispatch te ondersteunen. Voor C++ is het grotendeels handwerk naar mijn weten. Het zou me overgens niet verbazen als BCB je hierbij goed kan helpen, ik heb alleen daarvoor te weinig kennis op dit gebied om dit te garanderen.

[ Voor 4% gewijzigd door LordLarry op 10-04-2003 15:13 ]

We adore chaos because we like to restore order - M.C. Escher


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Surehand schreef op 10 april 2003 @ 14:50:
[...]
Probeer het eens zonder 'new'. Je roept een functie aan, geen constructor...

(ook in de link die je zelf opgeeft staat een voorbeeld zonder new)
Sorry.. :o :o Ik heb de sourcecode gecopieerd waar ik mee had lopen klooien omdat het niet lukte... Ik had in eerste instantie de code gekopieerd van de link.
Maar de functie zonder new returned exact hetzeflde....

Wat wel interressant is om te zien is dat het verschil tussen de link van Larry en de link van me zelf relatief klein is... Ik denk dat ik ze maar eens uitgebreid ga vergelijken... Ik ben van mening dat de eerste link ook zou moeten werken....

Tnx, both

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Een COM object heeft IUnknown als basis, wat het absolute minimum is voor een COM Object. Een Automation Object heeft IDispatch (die afleid van IUnknown) als basis. Deze interface zorgt ervoor dat late binding mogelijk wordt. Late binding is nodig als je ooit via scripttalen of (vroeger?) VB je COM object wilt laten gebruiken. In veel talen is het geen tot weinig extra werk voor een object om IDispatch te ondersteunen. Voor C++ is het grotendeels handwerk naar mijn weten. Het zou me overgens niet verbazen als BCB je hierbij goed kan helpen, ik heb alleen daarvoor te weinig kennis op dit gebied om dit te garanderen.
M.a.w. COM en Automation zijn gelijk m.u.v. dat automation uitgebreider is. Dus ik kan beter Automation gebruiken omdat ik dan gelijk gebruik maak van een paar leuke extra's?

Bedank voor je uitleg trouwens.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ja en waarschijnlijk kosten deze extra's je geen extra werk.

Geen dank, graag gedaan.

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1