21. juli 2005 - 08:38Der 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".
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 :)
Synes godt om
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.
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 ?
..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
Synes godt om
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.
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).
Synes godt om
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....
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)
Synes godt om
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.
Synes godt om
Ny brugerNybegynder
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.