Meny
Är gratis
checka in
den huvudsakliga  /  Utbildning / Det gick inte att skapa ett objekt av ActiveX CDO-meddelandebehållaren. Skapa ActiveX Containers Containers

Det gick inte att skapa ett objekt av ActiveX CDO-meddelandebehållaren. Skapa ActiveX Containers Containers


Redigera Windows-registret manuellt för att radera tangentknappsfel 800A01AD rekommenderas inte om du inte är en PC-tjänstes specialist. Fel tillåtna vid redigering av registret kan leda till din dators inoperabilitet och lägga irreparabel skada på operativsystemet. Faktum är att även ett komma som levereras inte på platsen, kan förhindra nedladdning av datorn!

På grund av denna risk rekommenderar vi starkt att du använder en pålitlig registretrenare som WinThruster [Download] (utvecklad av Microsoft Gold Certified Partner) för att skanna och reparera eventuella 800A01AD-felproblem. Med hjälp av registret Cleaner [nedladdning] kan du automatisera processen att söka efter skadade registerposter, länkar till saknade filer (till exempel, vilket orsakar felet %% error_name %%) och icke-fungerande länkar i registret. Före varje skanning skapas en säkerhetskopia automatiskt, vilket gör att du kan avbryta några ändringar till ett klick och skydda dig från eventuella skador på datorn. Det trevligaste är att eliminering av registerfel [nedladdning] dramatiskt kan öka systemets hastighet och prestanda.


En varning: Om du inte är en erfaren PC-användare rekommenderar vi inte att du redigerar Windows-registret. Felaktig användning av Registerredigeraren kan leda till allvarliga problem och kräva ominstallation av Windows. Vi garanterar inte att funktionsfel som är resultatet av den felaktiga användningen av registerredigeraren kan elimineras. Du använder registerredigeraren på egen risk.

Innan du återställer Windows-registret måste du säkerhetskopiera en del av 800A01AD-felregistret (till exempel ActiveX):

  1. Klicka på knappen Att börja.
  2. Stiga på " kommando." i låssökning ... Tryck inte på STIGA PÅ!
  3. Håller nycklarna Ctrl-Shift. Klicka på tangentbordet STIGA PÅ.
  4. En dialogruta för åtkomst visas.
  5. Klick Ja.
  6. Den svarta lådan öppnas med en blinkande markör.
  7. Stiga på " regedit."och tryck på STIGA PÅ.
  8. I Registereditorn väljer du den 800A01AD-relaterade felknappen (t.ex. ActiveX) som du vill säkerhetskopiera.
  9. På menyn Fil Välja Exportera.
  10. I listan Spara B. Välj den mapp som du vill spara ActiveX-knappen Backup.
  11. I fält Filnamn Ange namnet på säkerhetskopieringsfilen, till exempel "ActiveX Backup".
  12. Se till i fältet Exportområde Valdat värde Vald gren.
  13. Klick Spara.
  14. Filen sparas med tillägg.reg..
  15. Du har nu en säkerhetskopia av din ActiveX-relaterade registerpost.

Följande steg med manuell redigering av registret kommer inte att beskrivas i den här artikeln, eftersom det är mycket sannolikt att skada ditt system. Om du vill få mer information om redigering av registret manuellt, läs länkarna nedan.

System och alla anslutna är tillgängliga. Det här felet har följande skäl och lösningar:

    Klassen är inte registrerad. Till exempel, i systemets register finns det inget omnämnande av klassen, eller klassen nämns, men indikerar fel typ eller till en fil som inte kan hittas. Om möjligt, kör objektansökan. Om registerinformationen är felaktig eller föråldrad, kommer programmet att kontrollera registret och korrigera denna information. Om programmets start inte hjälper till att åtgärda problemet, kör programinstallationsprogrammet igen.

    Det gick inte att använda det DLL-bibliotek som krävs av objektet eftersom det inte hittas eller hittats skadat. Se till att alla relaterade DLL är tillgängliga. Till exempel kräver dataåtkomstobjekt (DAO) DLL-support, vilket skiljer sig beroende på plattformen. Om det här är orsaken till felet måste du starta om installationsprogrammet för ett sådant objekt.

    Objektet är tillgängligt på en dator, men är licensierad, och det kan inte verifiera tillgängligheten av den licens som är nödvändig för att skapa en förekomst av ett objekt.

    Instanser av vissa objekt kan endast skapas efter att komponenten hittar en licensnyckel som bekräftar registreringen av detta objekt för att skapa en instans på den här datorn. Om det finns en referens till objektet i den korrekt installerade eller korrekta nyckeln, tillhandahålls den automatiskt.

    Om ett försök att skapa en instans är resultatet av funktionssamtalet CreateObject. eller Getobject.Objektet måste hitta nyckeln. I det här fallet kan den söka i systemregistret eller söka efter en speciell fil som den skapar när den är installerad (till exempel, med förlängning.). Om nyckeln misslyckas med att hitta, kan ett objekt-instans inte skapas. Om slutanvändaren felaktigt konfigurerade objektprogrammet, raderade den önskade filen eller ändrade systemets register, objektet inte kommer att kunna hitta sin nyckel. Om nyckeln inte hittas är det omöjligt att skapa ett objekt-instans. I det här fallet kan skapandet av en instans fungera i utvecklaresystemet, men inte i användarsystemet. Användaren ska installera om det licensierade objektet.

    Du försöker använda funktionen att ta emot objektet Getobject.För att få en länk till den klass som skapats med Visual Basic. Getobject. Du kan inte använda för att få en referens till en klass som skapats med hjälp av Visual Basic;

    Tillgång till objektet är uttryckligen förbjudet. Till exempel försöker du komma åt dataobjektet, som för närvarande används och låses för att förhindra sammankoppling. I det här fallet kan du få tillgång till objektet vid en annan tidpunkt.

För mer information, välj objektet som frågan uppstod och tryck på F1-tangenten (i Windows) eller hjälp (på Macintosh-datorn).

Alexander Kostarev
Programmerare av programmet R-Style Software Lab.

Att skapa ActiveX-kontroller är allmänt upplyst i speciell litteratur. Men metoderna för att skriva ActiveX-Containers anses vara mycket mindre frekventa, främst endast inom deras interaktion med ActiveX-objekt. Ännu mindre publikationer ägnas åt förfarandena för att utveckla behållare som stöder sitt eget programgränssnitt (API), som ger arbete med dem och föremål som finns i dem från andra applikationer eller skriptspråk. Exempel på sådana behållare innefattar sådana mjukvaruprodukter som Microsoft Visual Basic, Borland Delphi, etc.

På grundval av befintliga behållare kan emellertid ett antal uppgifter inte lösas - det kräver specialiserade kontrollbehållare. En av dessa uppgifter är att skapa en expanderbar applikation som låter dig automatisera frekventa operationer som inte kunde förutses under utvecklingen. Automatisering kräver att ansökan ger tillgång till sina föremål från utsidan och integrerades med utbyggnadsutvecklingsverktyget. Att bygga ett användargränssnitt är i de flesta fall baserat på olika kontroller i formuläret - behållaren av ActiveX-objekt. Således kräver skapandet av verktyget skapandet av ActiveX-behållaren.

Vi kommer att titta på några problem som härrör från införandet av komponentarkitektur till det instrumentala komplexet, liksom metoder för att lösa dem. Detta kan undra hur man utvecklar behållare med kontroller av kontroller och utvecklare av ActiveX-objekt, eftersom artikeln visar syftet och metoderna för att använda olika metoder för standardkontroller på behållarens kontrollsida.

De föreslagna lösningarna är baserade på erfarenheten av att utveckla verktygskomplexet RS-Forms - den nya mjukvaruprodukten i R-Style Software Lab. RS-formulär innehåller ett medel för att utveckla ett grafiskt användargränssnitt på Windows-plattformen, den programkörningsmiljö som skapas med hjälp av RSL *, C och C ++ - Språk, liksom RSL-programmets felsökningssystem.

* Objekt RSL är ett programmeringsspråk på hög nivå skapat i R-Style Software Lab. För detaljer, se http://www.softlab.ru/products/rsl/. - Ungefär. ed.

Projektet genomförde den första versionen av designformerna (bild 1), så att du kan skapa formulär, genomföra både standardkontroller och godtyckliga ActiveX-objekt, spara färdiga former i lagringen på ett konstant media av information och ladda dem från den . Med hjälp av en designer kan du visa egenskaper, metoder och händelser av ett kontrollelement inbäddat i formuläret, ändra egenskapsvärdena.

Designern är baserad på den aktiva kontrollbehållaren (form), som tillhandahåller den ovan beskrivna funktionaliteten. Dessutom stöder formen olika alternativ för att konfigurera sin presentation, inklusive den procentuella bindningen av inbäddade element till gränserna, kontrollera sekvensen av deras bypass-tangentbord, deras synlighet, headset och teckensnittstorlek, färgbakgrund, text, etc.

Förutom att utveckla ett grafiskt användargränssnitt i designern läggs mekanismen för automatisk kodgenerering i C ++ och RSL-språk. Det är viktigt att notera att alla operationer som utförs ovanför formuläret i designern är tillgängliga i exekveringsläget från programkoden.

Fikon. 1. Designerformer.

Den grafiska formen som skapats i designern kan användas i någon C / C ++ -applikation, såväl som från något skriptspråk, som visuell grundläggande eller RSL. När du använder formulär i C ++ - Program som utvecklats med MFC-biblioteket, kan designern användas som redaktör för dialogrutor.

Låt oss nu diskutera begreppet konstruktion av behållaren och principerna om att arbeta med ActiveX-kontrollelementen.

Basic containerfunktioner

Alla kontrollkontrollbehållare måste ha en funktionalitet som skulle göra det möjligt för dig att skapa ActiveX-objekt, säkerställa att de är korrekta, raderar dem från RAM, samt spara objekt till lagring av objekt på ett konstant informationsmedia och ladda ner dem från det *. Behållaren innehåller ett antal komponenter (fig 2), vilket ger standard (i enlighet med Microsoft ActiveX-teknik) den funktionalitet som krävs för korrekt drift av kontrollerna.

* Allmänna frågor om byggbehållare och servrar av Com-objekt beaktas i boken D. Cheppel "ActiveX och Ole Technologies" - M.: Ryska redaktionen, 1997.

Behållaren stöder en samling (till exempel en lista) av kommunikationsobjekt med ActiveX-element - ett med ett kommunikationsobjekt till varje styrelement. Dessutom bör en standardmanipuleringsmekanism med elementen i denna samling tillhandahållas i den programmerbara behållaren.

Kommunikationsobjektet för kontrollplats är ansvarigt för den korrekta interaktionen av motsvarande element med behållaren. Varje objekt med kommunikation innehåller en enhet som utökar kontrollen av kontrollen av egenskaperna, metoderna och händelserna för en viss behållare. En sådan enhet kallas en utökad kontroll (utökad kontroll). Ett exempel på avancerade egenskaper kan fungera som ett namn (namn), plats i en behållare (bredd, vänster) och liknande. Specificerade uppsättningar är behållarens egenskaper, och inte något separat kontrollelement, även om det här är hur det söker efter användarens användare. Det finns flera alternativ för att implementera en utökad kontroll. Det kan till exempel vara föremålet för kommunikationsobjektet (se fig 2) eller ett riktigt COM-objekt som aggregerar källkontrollen. Varje alternativ har sina fördelar och nackdelar. I den här artikeln anser vi bara det första sättet.

Varje avancerat kontrollelement innehåller en händelsemottagare (händelsesänkning) från kontrollen som är associerad med den (fig 2). Dess uppgift innefattar den främsta identifieringen av de mottagna händelserna (användarbehandlingen av händelsen krävs eller inte) och, om nödvändigt, överföra dem till sitt ägarobjekt (utökad kontroll), vilket ger rutningen av händelser på behållarobjekthierarkin.

Skript skapande av kontrollelement

Genomförandet av kontrollen i behållaren består av tre faser: skapa ett ActiveX-objekt, initialisering och aktivering.

Kontroller skapas i behållarens adressutrymme med hjälp av standard COM-funktioner, såsom CoCreateLeStance. Den motsvarande globala unika CLSID-klassidentifieraren överförs som en identifierare av funktionskontrollen av funktionen. Det bör noteras att behållaren måste stödja olika alternativ för att identifiera COM-objekt i systemet - som identifieraren för progidprogrammet, klassens unika identifierare i form av en sträng etc.

Huvudsyftet med initialiseringsfasen är att sända kontroll via IOleObject :: Setclientsite-funktionen till Ioleclientsite-gränssnittet för kommunikationsobjektet och funktionen i Ipsiststreaminit-funktionen :: InitNYW eller IPersistStreaminit :: Ladda (beroende på om objektet från lagringen är laddad eller ej). Överföring av pekaren till Ioleclientsite-gränssnittet kan inträffa före lastning / initialisering eller efter; Överföringen av överföringen bestäms av närvaron av en olemisc_setclientsItFirst (IoleObject :: getMiscstatus). Det är viktigt, eftersom det beror på pekarens överföring, vid vilken tid kontrollelementet kommer att få värdena för miljöegenskaperna (omgivande egenskaper) från behållaren. Om den här funktionen ignoreras, kan ActiveX-objektets ytterligare funktion vara felaktig.

Sedan är det inom ramen för den aktuella fasen nödvändig att initialisering av egenskaperna hos den utökade kontrollen som kompletterar det skapade ActiveX-objektet. Till exempel är det nödvändigt att korrekt ställa in objektnamnet (initiera namnet på egenskapen, vilket säkerställer identifiering av kontrollelement i behållaren). Den här egenskapen måste stödja någon kontroll som är inbäddad i den programmerbara behållaren, men det är ändå behållarens egendom. Ofta är standardobjekten tilldelat ett kort namn på den klass som de tillhör (det här namnet returnerar IOleObject :: Getusertype-metoden för parametern Userclasstype_short), med tillägg av ett numeriskt index, vilket säkerställer det unika namnet på kontrollerna i behållaren. Om det angivna namnet inte kan erhållas eller om det inte uppfyller behållarens logik kan du ange ett visst fördefinierat namn med motsvarande index.

Att aktivera styrorganet innebär en viss sekvens av åtgärder. För det första är det nödvändigt att fastställa återkopplingen av ActiveX-objektet med kommunikationsobjektet på kontrollplatsen. För att göra detta kallas IoleObject :: Advisionsmetoden som pekaren överförs som en parameter till det vanliga IADViseSink-kommunikationsobjektets gränssnitt. Därefter är det nödvändigt att korrekt begära Iviewobject Family-gränssnittet (enligt specifikationen, kan ActiveX-objektet stödja Iviewoughject, Iviewobject2, Iviewobjectex, som består av arvshierarkier) och ställer in återkopplingshierarkier för det genom att ringa IviewoWObject-metoden :: SetAdvise med överföringen av pekaren till IAdvisesink. Dessutom är det nödvändigt att informera kontrollen av sitt behållarens namn (det implementeras genom att ringa iOleObject: setostname-metoden), begär och spara alla gränssnitt som krävs för korrekt drift (åtminstone IoleinplaceObject och Iolecontrol). Det sista är att utföras för visuell visning av kontrollen, är att ringa IOleObject :: doverb * -funktionen med parametern Oleverb_inplaceActivate.

* I ATL-implementering är den angivna funktionen bland annat ansvarig för att skapa ett fönster för vanliga (fönster) kontroller.

Skript som tar bort kontrollelementet

För att ta bort kontrollerna som är inbäddade i behållaren måste du uteslutas från insamlingen som motsvarar det kommunikationsobjektet med ett element i kontrollen och utför sedan sekventiellt två operationer: brytning av omvända länkar och släpp de sparade pekarna till ActiveX objektsgränssnitt.

För att bryta tillbaka återkopplingen är det först och främst att rapportera till det gärviktiga elementet i behovet av att frigöra (genom att ringa den inknown :: utgåva) pekarna till IADViseSink-gränssnittet för kommunikationsobjektet. För att göra detta kallas iviewobject: s setadvisningsmetoder (med en överföring som ett null-argument) och OleObject :: UNADVISE, vilket måste sparas vid aktiveringsstadiet. Följande är nödvändigt för att aktivera ActiveX Object Deinitialization-proceduren (kallad IOleObject :: Stängfunktion). I nästa steg rapporterar managementelementet behovet av att släppa pekaren till det ioleClientsite-gränssnittet, för vilket det kallas OleObject :: Setclientsit med nollparametern.

Utlösningsfasen hos de sparade pekarna till kontrollgränssnittet är seriell samtal för dem frigöringsmetoden. Så snart den sista pekaren är fri, kommer ett objekt (enligt COM-teknik) att raderas från RAM.

Script Spara och Ladda ner

Att spara behållarobjektet i förvaret, oavsett vilken typ av den senare, är att bibehålla behållarens egenskaper (till exempel miljöegenskaperna) och insamlingen av inbäddade kontroller, dvs identifierare och egenskaper (inklusive förlängda) vardera ägd objektsamling. Den globala unika CLSID-klassidentifieraren kan fungera som kontrollidentifieraren. Detta gör att du kan skapa det önskade ActiveX-objektet vid initialiseringssteget och ladda det med sina data som finns i förvaret efter den angivna identifieraren. För att spara egenskaperna hos kontrollelementet, till exempel, kallas strömmen för Save-metoden för standardgränssnittet för ActiveX Isiststreaminit-objekt. För att ladda, kallas lastmetoden för samma gränssnitt.

Ett sådant sparningsförfarande säkerställer den efterföljande restaureringen av lagringsbehållarens föremål. Den beskrivna metoden fungerar bra, förutsatt att från det ögonblick som sparas och tills belastningen inte ändrar versionen eller raderar några kontroller från systemet. Sådana situationer uppstår ofta vid överföring av datalagring från en dator till en annan, där de sparade ActiveX-objekten inte har installerats eller registrerats. I det här fallet kommer laddningsobjektet från förvaret att leda till antingen den dödliga slutförandet av programmet, eller det kommer att vara orsaken till hela behållarens lastfel som helhet. För att förhindra fel är det nödvändigt att tydligt ställa in gränsen mellan data för olika kontroller, registrera storleken på den information som sparas på dem efter objektidentifieraren. Detta tillåter att hämtningsfasen är exakt placerad i början av data för varje ActiveX-objekt, samt hoppa över kontrollerna som oregistreras i systemet, men ladda behållarens objekt som helhet.

Gränssnitt samling av ActiveX-objekt

I enlighet med standarden bör behållaren av kontrollerna säkerställa interaktionen mellan ActiveX-objekt inbäddade i den. För att göra detta måste du stödja Iolecontainer-gränssnittet, vilket gör att du kan lista alla kontroller som sätts in i den. Om det finns en utökad kontroll (utökad kontroll) måste noteringen passera på sina iUnnown-gränssnitt, och inte av gränssnittet för basobjektet.

För att ge tillgång till insamling av automationsklienter, fungerar som ett standardgränssnitt för samlingen av objekt. Standardsamlingen innehåller tillägget, ta bort, klara, objektmetoder och _newenum och count-egenskaper, vilket ger omfattande brutta kraftelement. Till exempel använder designen av den visuella grundläggande för varje språk _newenum-egenskapen för att lista objekt, och för nästa design antar användningen av räkenskapen och objektmetoden. I objektet RSL-språket används _newenum-egenskapen när du öppnar den vanliga ActiveX CreenaNum-objektmetoden. Detta illustrerar till exempel RSL-programutskrift med den angivna metoden för filnamn som öppnas i Microsoft Excel (dess text visas nedan).

Importera RSLX; Ob \u003d ActiveX ("Excel.Application", , sant); en \u003d ob.Workbooks.creeenum; medan (en.nästa) Println (en.item.name) slutet;

De ansedda scenarierna gör att du kan utveckla funktionerna för att lägga till kontroll till behållaren och ta bort det. I de flesta fall skapar tilläggsfunktionen ett föremål för kommunikation med ett element i kontrollen (lagring av alla nödvändiga pekare till gränssnittet till ActiveX-objektsgränssnittet) och orsakar en liknande funktion. Den senare implementerar i sin tur det implementeringsscenario som beskrivs ovan (eventuellt utan aktiveringsfasen). Om bildandet av ActiveX-objektet i RAM har passerat framgångsrikt, lägger behållarens funktion motsvarande kommunikationsobjekt till det till samlingen. Ofta kombineras på grund av deras likhet med proceduren för implementering och laddning av ett element av kontroll från förvaret.

* * *

Vi granskade här de grundläggande frågorna i samband med byggandet av kontrollbehållare: implementering, visuell display, spara och lastning av ActiveX-objektet, liksom dess korrekta borttagning från RAM. Men i färd med att skapa en grafisk instrumental miljö behövde vi emellertid implementera flera behållare, vilket skulle skilja sig från varandra som tillhandahålls av automationsgränssnitt, delmängder av tillåtliga för att implementera ActiveX-objekt, uppsättningar av egenskaper, metoder och händelser av utökade kontroller, etc. . För detta föreslog en modell som låter dig skapa olika behållarelement och väl integrerade med ATL-biblioteket. Oberoende på specifika gränssnitt uppnås genom användning av mallklasser vars parametrar är dessa gränssnitt.

* Till exempel är flikkontrollelementet en egenskapsbehållare som är generella behållare.

Med den här modellen kan du snabbt skapa grundläggande varianter av olika ActiveX-objekt som är inneboende i "Container Logic". Dessutom gör det möjligt för den implementerade infrastrukturen att skapa behållare som inte är element i ledningen. En sådan behållare kan placeras som ett Windows-fönster till vilken del av programmet som utvecklas och sedan skickar motsvarande meddelanden, för att bädda in olika kontroller i den.

Som ett resultat, en ganska flexibel arkitektur av byggbehållare, som du kan skapa en trollkarl (trollkarl), som utökar funktionaliteten i Microsoft Visual Studio-miljön till mekanismen för att generera en containerö.