Toon posts:

[VB6]DLL Compileren met references naar niet bestaand object

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo mensen,

mijn probleem is moeilijk te omschrijven... maar het zit als volgt. Ik heb een DLL geschreven voor Powerpoint. Deze moet werken met Powerpoint 2000, XP, 2003 en 2007. Nu zit er een functionaliteit in die alleen op 2007 werkt (objSlideMaster.CustomLayouts), voordat mijn dll op dit punt aankomt zit er een check in of er gebruik word gemaakt van office 2007 of eerder. De code word dus NIET uitgevoerd als je op een office 2000 machine werkt. Maar nu heb ik de DLL gecompileerd op een machine met office 2007, daar werkt de dll ook vlekkeloos. Echter, als ik deze nu gebruik op een office 2000 machine kan ik het object niet creeeren, exacte foutmelding heb ik nog niet (complexe logging functionaliteit zit voor het punt waar de dll aangemaakt word, deze moet ik echter nog uitbreiden) maar de fout die ik nu krijg is: ActiveX component can't create object (#-30).
Het object word aangemaakt vanuit een HTC, vandaar de simpele foutmelding denk ik. Debuggen op de office 2000 machine kan niet, want voor het compileren heeft VB6 MSPPT12.OLB van office 2007 nodig, handmatig een reference naar deze handmatig gekopieerde file plaatsen kan ook niet, aan de hand van de GUID pakt VB6 automatisch dezelfde files van office 2000.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Kwestie van error-handling inbouwen? (Nu is dat in VB6 niet 's werelds, maar het is te doen).

Visual Basic:
1
2
3
4
5
6
7
8
Public Function MyCreateObject(ClassName as String) as object
  On error Goto errCreate
  MyCreateObject = CreateObject(ClassName)
  Exit Function
errCreate:
  MsgBox("Uh oh!")
  MyCreateObject = Nothing
End Function

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
RobIII schreef op dinsdag 03 april 2007 @ 11:36:
Kwestie van error-handling inbouwen? (Nu is dat in VB6 niet 's werelds, maar het is te doen).

Visual Basic:
1
2
3
4
5
6
7
8
Public Function MyCreateObject(ClassName as String) as object
  On error Goto errCreate
  MyCreateObject = CreateObject(ClassName)
  Exit Function
errCreate:
  MsgBox("Uh oh!")
  MyCreateObject = Nothing
End Function
Dat zit erin, maar het probleem is dus, dat hij denkt dat hij het object niet kan aanmaken omdat hij eventueel een property van een object nodig heeft die op een office 2000 machine niet bestaat. Maar hij detecteert dus niet dat dit nooit voor kan komen op een office 2000 machine omdat dit netjes door een versie check word afgevangen.

[ Voor 6% gewijzigd door Verwijderd op 03-04-2007 11:40 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ja, in zo'n geval ga ik in VB6 toch altijd voor late-binding en dus zonder harde references. De overhead en snelheidsverschillen zijn zelden echt merkbaar/meetbaar en dan is het enige nadeel nog voor jezelf (geen intellisense en dat soort zaken... en dat kun je oplossen door tijdelijk een harde reference te maken en die later weer te verwijderen).

En verder is het dus op de juiste plaatsen error-handling in bouwen (desnoods, als het om 1 property gaat en niet erg belangrijk is, on error resume next voor het setten van de property en on error goto 0 erna (om de 'errorhandler' weer te resetten)).

[ Voor 95% gewijzigd door RobIII op 03-04-2007 11:48 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Heb het probleem gelocaliseerd, heb de olb files op de office 2000 machine van office 2000 weggegooid, references opnieuw geplaatst naar de handmatig geplaatste files van office 2007, en nu kan ik debuggen, probleem blijkt toch niet in deze property te zitten (dan zou ik tenslotte ook een runtime error moeten krijgen en geen cant create object). Topic kan dus eigenlijk dicht, probleem zit in een functie die powerpoint opstart

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Een slotje is niet nodig op een topic als je je oplossing hebt. Zie daarvoor ook onze faq betreffende topiceinde.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Ok, het probleem heeft nu dus verder niks meer met dit topic te maken, maar ik zal verder gaan ;)
Probleem is na het starten probeer ik het Application object van powerpoint te krijgen, en dit gaat op office 2000 mis:
Visual Basic 6:
1
Set app = VBA.GetObject(, "PowerPoint.Application")

Verwijderd

Topicstarter
Ik denk dat het probleem toch het early/late binding verhaal is. Ik heb 2 dlls, en beide werken niet meer ... ik ga dus eens van beide late binded dll's (leuk woord) maken :P

  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 27-11 15:14

ZaZ

Tweakers abonnee

RobIII schreef op dinsdag 03 april 2007 @ 11:41:
(geen intellisense en dat soort zaken... en dat kun je oplossen door tijdelijk een harde reference te maken en die later weer te verwijderen).
Wat ik altijd doe in dat soort situaties is wel een harde reference maken, maar zolang je die niet instantieert is er geen probleem. Dus dan gebruik maken van compilation arguments, met als gevolg; in de IDE is het early bind en zodra je het compileert late bind.
Zonder externe tools zou je vlak voor het compileren een parameter moeten wijzigen, maar er zijn ook extensions beschikbaar (vbadvance bijv) die het kunnen automatiseren.

Weet je ongetwijfeld allemaal al, maar is gewoon een tip voor mensen die ook nog met vb legacy werken.

Lekker op de bank

Pagina: 1