Hallo allemaal,
Ik ben bezig met een project waarbij ik een USB interface moet maken voor een groot en complex ASIC evaluation board.De interface vindt plaats tussen een PIC18F4550 en een Windows XP PC.
Nu heb ik een C++ applicatie ontwikkeld die gebruik maakt van een ActiveX element (HIDagent) om de USB te besturen. Hierdoor is de code die nodig is voor de USB véél minder en is de boel ook nog eens veel overzichtelijker.
Tot zover dus geen probleem, de USB interface werkt en alle functies die ik heb geschreven werken prima (SPI interface, I2C interface, PWM etc.).
Echter nu is de opdracht om het geheel te integreren in een Labview VI. Hier zal ik verder niet te diep op ingaan, want erg relevant is deze info niet. Waar het op neer komt is dat alles in een DLL geintegreerd moet worden.
Nu heb ik met Borland studio C++ 2006 een DLL gemaakt van de bestaande code. Deze DLL bevat een aantal simpele externe functies, zoals ReadSPI();
Vervolgens een test applicatie gemaakt waarin ik de DLL importeer en test. Alle functies zijn toegankelijk en de functies die géén gebruik maken van de ActiveX werken prima. Echter alle functies die wel gebruik maken van de ActiveX geven een "Access Violation" error.
Heeft iemand enig idee hoe ik dit het best kan oplossen? Ik ben handig in het maken van C++ code, maar van DLL's en ActiveX heb ik niet veel verstand. De ActiveX is geregistreerd in Windows en werkt vanuit zowel Labview als C++. Het zelfde geldt voor de DLL, uitgezonderd de eerder genoemde functies. De ActiveX is geintegreerd in de C++ code waarvan ik de DLL maak, hij is dus aanwezig binnen de DLL.
Wie o wie kan mij verder op weg helpen?
Bedankt alvast!
Groeten S@m
P.s Ik hoop dat het geen probleem is om deze vraag op dit forum te stellen? Het blijft natuurlijk een interface met een PIC processor
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
volgens mij lukt dat niet.
activex is normaal gesproken niet 'formless'.
het eenvoudigste zou zijn een hidden form in je dll te stoppen, die t laden en direct te minimaliseren.
je kan ook proberen de activex dynamisch te laden. in VB kan dat. hoe het in c moet weet ik niet.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Voor veel ActiveX elementen kan de ATL71.DLL als 'container' gebruikt worden. Dit kan bij o.a. PowerBasic, ik neem aan ook met C++ (Misschien wat zoeken op ATL71.DLL...)
@free_electron
Ik heb geprobeerd om het via een extra form te doen, maar helaas zonder resultaat. Op zich ook wel logisch want ik gebruikte al een controlform om het ActiveX element op te hosten. Daarna heb ik geprobeerd om de ActiveX.lib file mee te linken met de DLL, maar het lijkt wel of hij dit niet doet. De DLL blijft 38Kb groot, met of zonder deze lib file.
Het mee linken doe ik door:
LoadLibrary("HIDagent.lib");@ARCO De ATL71.DLL heb ik nog niet geprobeerd. Hoe bedoel je precies dat ik hem als container kan gebruiken? Kan je een voorbeeld noemen?
Wellicht heeft iemand nog andere suggesties? 
SparkyGSX
Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Met LoadLibrary wordt de library niet mee gelinkt, dat is "late binding". Je compiler heeft er geen flauw benul van dat je daar probeert een library te laden, het is gewoon een function call naar het systeem. Waarschijnlijk zul je die LIB toe moeten voegen aan je project.
Kun je eigenlijk wel .lib files laden op die manier? LoadLibrary wordt gewoonlijk gebruikt om DLLs en zo dynamisch te laden, en .lib files zijn alleen bruikbaar voor de compiler, voor zover ik weet. Controleer je de return waarde van LoadLibrary?
Borland is wel een beetje lastig met DLLs en LIBs, in ieder geval wel altijd geweest. Ik meen me iets te herinneren van een tooltje die je los moest laten op de LIB files om er iets anders van te maken waar Borland C mee overweg kon. Geen idee of dat nog steeds zo is.
ActiveX componenten moeten, geloof ik, wel een referentie hebben naar een form (een form handle dus), maar dat form hoeft niet zichtbaar te zijn. Een form handle is wat windows gebruikt om messages te kunnen sturen.
Het zou ook kunnen dat het mis gaat met je message pump, ik weet er het fijne niet meer van, maar misschien dat je die kant op moet zoeken.
Ik heb in het verleden veel met dit soort dingen gedaan (ook debuggers geschreven en zo), maar dat is een beetje weggezakt (of moet ik zeggen verdrongen?).
Ik weet nu ook weer waarom ik zo'n hekel heb aan software schrijven voor windows. Doe mijn maar een lief RTOSje of zo.
Je hebt helemaal gelijk omtrend LoadLibrary. Op zich gaat Borland redelijk eenvoudig om met DLL's, met een simpele header (met daarin de DLL functies ) kun je de DLL functies aanroepen vanuit een CPP file.
Helaas gaat het daarna fout, omdat de DLL contact zoekt met het ActiveX element en dat staat windows(?) niet toe lijk het.
De oplossing lijkt dus te zitten in het integreren van de ActiveX in de DLL, maar hoé?
Anyway, ik ga nu weekend vieren en ga er maandag mee verder. Hopelijk krijgen we in de tussentijd nog goede ideen 
free_electron
Silicon Member
Professioneel ElectronenTemmer - siliconvalleygarage.com - De voltooid verleden tijd van 'halfgeleider' is 'zand' ... US 8,032,693 / US 7,714,746 / US 7,355,303 / US 7,098,557 / US 6,762,632 / EP 1804159 - Real programmers write Hex into ROM
how . daar had ik compleet overheen gekeen. je gebruikt Brolland ... er is ene probleem daarmee. een Dll e(en ActiveX) kunnen 2 manieren van aanroepen hebben. ( Microsoft way en c-style ) daar zou wel eens ene probleme kunnen ziten.
een activex aanroepen vanuit ene dll is eigenlijk een tegenstrijdig iets. een activex draait bovenop een DLL .... kan je niet stomweg een programma maken wat interprocess communicatie doet ?
ik heb nu een programma wat allerhande spul doet ( FPGA en ARM sturen ver USB , GPIb communicatie en dergelijke. ik laadt dat gewoon maar ik open een TCP/Ip poort.
als je dan connecteert naar 127.0.0.1 ben je binnen. ik kan sturen vanuit eendert welk programma ( nu onderandere matlab )
ik denk nog net aan iets. je wilt een dll maken met een form in .. dat lukt ook niet zomaar ... je hebt speciale tartup code nodig daarvoor. het zou daar wel al eens in de soep kunnen draaien. maak eens ene dummy dll met alles erin ( form inclusief ) je laadt gewoon dynamisch bijvoorbeeld een button of textbox . kijk eens of dat al werkt ...
wat je ook kan proberne is microsoft C express halen ( is gratis ) en de dll daar mee proberne compileren .
lees ook deze eens door
http://www.circuitcellar.com/library/print/0504/Bachiochi166/index.htm
maar eh. je ding gebruikt HID.. dan heb je toch geen activex nodig ? USB complete van Jan Axelson heeft volledige voorbeelden om HID te doen zdirect met kernel calls zonder thrid party rommel.
[Bericht gewijzigd door Henry S. op (35%)]
Zo daar ben ik weer 
De afgelopen dagen flink aan het puzellen geweest om de oorzaak van het probleem op te sporen. En dat is uiteindelijk gelukt!
De oorzaak bleek te zitten in het feit dat een control form in een DLL niet automatisch wordt aangemaakt. Aangezien de ActiveX op dit form stond werd er inderdaad geschreven naar iets wat niet bestond.
Ik maak nu het controlform handmatig aan en wel op deze manier:
CoInitialize(0);
Application->CreateForm(__classid(TCTRL), (&CTRL));
En pas daarna roep ik de ActiveX aan.Dan gaat het wel, want het form is dan reeds aangemaakt.
Hopelijk heeft iemand hier nog wat aan.
Bedankt voor het meedenken allemaal!!