Avatar billede Slettet bruger
21. juli 2005 - 08:38 Der er 13 kommentarer og
1 løsning

Hoste en activeX kontrol i C#

Hej eksperter

Jeg har en ActiveX kontrol i form af en OCX fil. Denne ActiveX kontrol vil jeg gerne anvende i mit c# projekt.

Jeg kan tilføje .ocx filen til min toolbox i Visual Studio, og herefter trække kontrollen ind på min form. Så sker der en masse "hokus pokus" (så vidt jeg har forstået bliver der bla. oprettet en "wrapper class" til ActiveX kontrollen, som bla. konverterer datatyper til .NET datatyper).

Men jeg synes det er en utrolig uelegant måde at have sin ActiveX kontrol kædet sammen med sit projekt. At et stykke kode, der ikke har noget med min GUI at gøre, skal optræde som et skjult GUI element, men dertilhørende autogenererede variabel-erklæringer samt kode i min form klasse, det bryder jeg mig ikke om.

Derfor:

Er det muligt. manuelt at importere og oprette et objekt ud fra en given OCX fil i C# / Visual Studio? Er der nogen, der evt. ligger inde med et godt link eller lign omkring dette?

Det skal siges, at jeg har prøvet at oprette en reference i mit projekt til min ocx fil, og forsøgt at anvende klasser direkte, som man ville gøre med alle andre klasser. Dette resulterede i en "InvalidActiveXStateException".
Avatar billede wisen Nybegynder
21. juli 2005 - 08:46 #1
Nej, det tror jeg ikke er muligt - jeg kender ihvertfald ikke andre måder :)

Det er det samme som hvis du vil benytte et almindeligt COM objekt - der skal også oprettes en wrapper som sørger for at marshalle mellem .NET og native typer. Derudover sørger wrapperen også for at styre levetiden af dit COM eller ActiveX objekt.. det synes jeg da ikke er særligt uelegant :)
Avatar billede Slettet bruger
21. juli 2005 - 13:16 #2
Elegant eller uelegant.... mit egentlige problem er at det skal fungere i en konsol applikation... og jeg har ikke fundet nogen måde at få min OCX til at makke ret uden at bruge en form.
Avatar billede wisen Nybegynder
21. juli 2005 - 13:30 #3
hmm... det lyder da mærkeligt - du vil bruge en GUI-dimmer i en konsol-applikation?
Avatar billede rbj_fp Nybegynder
21. juli 2005 - 13:54 #4
Nej, det er jo ikke det han skriver! Han skal åbenbart have en konsol-applikation, som har behov for en bestemt ActiveX komponent.

Problemet er vel at han ikke kan få komponenten til at virke uden en form.

smajli > hvilken komponent er det du skal bruge?
Avatar billede Slettet bruger
21. juli 2005 - 14:50 #5
Det er korrekt, at min komponent ikke er en "GUI dims" - det er en komponent, der stiller OPOS hardware såsom printere til rådighed for mit program.
Avatar billede wisen Nybegynder
21. juli 2005 - 14:53 #6
... er der nogen bestemt grund til at det _skal_ være en konsol applikation - kan du ikke lave en form der er skjult?
Avatar billede Slettet bruger
21. juli 2005 - 14:57 #7
ja... det er der en betemt grund til ;)
Avatar billede sovsekoder Nybegynder
28. juli 2005 - 18:24 #8
det "hokus pokus" der sker er at:
1) der oprettes referencer til interopfilerne.
2) der indsættes initialiserings kode.

kan du ikke gøre følgende:
1) lav et demoprojekt med GUI - dvs. tomt form-projekt.  Drag din ocx ind på formen. Se hvilke referencer der laves.

2)

*  kopier de interop-filer wizard'en har lavet (som ligger i bin/debug dir'et i GUI-projektet) - men kopier dem ind i dit nye konsol projekt
* i konsol projektet tilføjes de i references ved at pege dem ud (via browse)
* kopier initialiserings koden der vedrører OCX-koden, og lig den ind i constructoren i din konsol app.

det der kunne gøre at det ikke virkede kan være hvis ocx. absolut vil ha' et handle til at tegne på eller et eller andet mystisk i den stil - men det lyder ikke til det er det der er tilfældet... kunne det måske hjælpe ?
Avatar billede sovsekoder Nybegynder
28. juli 2005 - 18:35 #9
..den skal tilsyneladende også ha' en reference til system.windows.forms (pga AxHost) som der kaldet BeginInit på... hvad ved jeg... her ikke 100% tjek på det :o
Avatar billede Slettet bruger
29. juli 2005 - 08:58 #10
AxHost og Ax(kontrolnavn) klasserne er vist de wrapper klasser, som man rent faktisk kalder i koden.... så sørges der (via interopfilerne og/eller et type libary?) for at datatyperne oversættes til de datatyper som AxctiveX kontrollen bruger, og den "rigtige" kode afvikles derefter.

Så vidt jeg har forstået altså.... men jeg har sikkert nok forvirret nogle begreber.

Det, der irreterer mig mest, er at jeg ikke har været i stand til at finde en grundig gennemgang af emnet noget steder. De sider jeg har kunne støve op via google snakker i et meget "højt luftlag" synes jeg - altså de forudsætter at man ved en del om emnet på forhånd. Og det er også muligt, at jeg forsøger at opnå noget, som er lidt over min egen formåen - det skal jeg da ikke afvise.

Hvorom alt er, aå har jeg haft kontakt til det firma, der har udviklet ActiveX kontrollen, og de kan heller ikke give mig andet svar end "Vi anbefaler at du trækker kontrollen ind på en form".

Så jeg tror jeg må se slaget som tabt.... men jeg takker mange gange for jeres svar alligevel - jeg har bestemt opnået en større forståelse for hvilke mekaninsmer, der tages i brug, når man fra .NET frameworket hoster en ActiveX kontrol på en form. Så det er da i det mindste positivt.

wisen og sovsekoder I må gerne smide et svar. Vil gerne give point for indsatsen.
Avatar billede sovsekoder Nybegynder
29. juli 2005 - 14:38 #11
svar + x-tra info:
jeg prøvede at dragge en scriptengine.ocx fil ind på en form, og der kunne jeg se at den lavede to wrapper filer (interop.*.dll) - disse filer wrapper metoderne i OCX-filen. Men derudover blev der kaldt BeginInit inde i InitializeComponents. Metoden BeginInit blev kaldt på AxHost som åbenbart er activeX wrapperen som .NET bruger (og er placeret i system.windows.forms.dll). Jeg kunne initialisere scriptengine.ocx uden problemer i en konsol applikation vha. fremgangsmåden jeg skrev tidligere...

...og nu er jeg blot nysgerrig på om du har prøvet det samme, og om det faktisk ikke virker hos dig (altså om man ikke kan bruge den fremgangsmåde generelt).
Avatar billede Slettet bruger
29. juli 2005 - 14:42 #12
Jeg skal indrømme at jeg ikke har prøvet det, men jeg vil prøve det af på mandag og vende tilbare med svar....

Tak for svaret! :)
Avatar billede sovsekoder Nybegynder
29. juli 2005 - 14:50 #13
hvordan ser din kode ud i konsol applikationen (den som smider exception: InvalidActiveXStateException) - syns' det burde virke...

på msdn står der ved denne exception:
The public properties and methods of an ActiveX control can only be referenced after the ActiveX control has been instantiated and initialized completely

kunne tyde på at controllen ikke er initialiseret... (hvilket måske gøres ved AxHost.BeginInit)
Avatar billede Slettet bruger
29. juli 2005 - 14:55 #14
Jeg har tidligere leget lidt med beginInit og Endinit.... ud fra nogenlunde samme filosofi som den du beskriver. Dog uden held.

Jeg har dog som sagt ikke mulighed for at komme til koden igen før på Mandag... så skal jeg nok vende tilbage med mere info.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester