OveRRidEMedlem sedan feb. 200112 078 inlägg Jag får för mitt liv inte denna kod att fungera. Fråga mig inte varför. Jag har inkluderat referenser till ASP context library i projektet.
Public Function GetApplicationVar(strVariableName As String) As Variant
Dim objApplication As Object
[red]Dim ctxObjectContext As ObjectContext '<< felkod[/red]
Dim intError As Integer
On Error Resume Next
Set ctxObjectContext = GetObjectContext
Set objApplication = ctxObjectContext("Application")
GetApplicationVar = objApplication.Value(strVariableName)
If Err.Number <> 0 Then
GetApplicationVar = GetRegVariable(strVariableName)
End If
Set objApplication = Nothing
Set ctxObjectContext = Nothing
End Function
Felmess:
User-defined type not defined
nikoMedlem sedan juni 20022 599 inlägg Inget av det du använder i koden ligger i ASP Object Context-libbet utan i COM+ Services Type Library.
Vill du trots allt använda ASP-libbet så är det väl snarare ScriptingContext (i Microsoft Active Server Pages Object Library) än ObjectContext du ska använda?
http://www.webforum.nu/showthread.php?s=&threadid=60348&highlight=session
Detta funkar fint:
Option Explicit
Private ctx As ASPTypeLibrary.ScriptingContext
'Automatically called when object is instantiated
Public Sub OnStartPage(ASP_Scripting_Context _
As ASPTypeLibrary.ScriptingContext)
'Set global variable so we can reference
'scripting context in other functions and subs
Set ctx = ASP_Scripting_Context
End Sub
'Automatically called when object is instantiated
Public Sub OnEndPage()
Set ctx = Nothing
End Sub
'just in case...
Private Sub Class_Terminate()
Set ctx = Nothing
End Sub
Public Sub DoStuff()
ctx.Response.Write "foo"
End Sub
Men jag hoppas att du är medveten om att detta är att synda och är något man inte bör ta för vana att göra. ;)
OveRRidEMedlem sedan feb. 200112 078 inlägg
niko skrev:
Inget av det du använder i koden ligger i ASP Object Context-libbet utan i COM+ Services Type Library.
Då har jag blivit missinformerad. :)
Niko, du verkar ha bra koll på det där. Finns det någonstans man kan hitta någon slags lista på vilka av alla referenserna som gör vad eller kanske en förklaring kring vilka som är vanligast? Känns som man har noll koll på dem jämt. :)
Erik skrev:
Men jag hoppas att du är medveten om att detta är att synda och är något man inte bör ta för vana att göra.
Att blanda in ASP i en (flyttbar) komponent? Nja, såå skalbar behöver den inte vara. ;)
nikoMedlem sedan juni 20022 599 inlägg
OveRRidE skrev:
Finns det någonstans man kan hitta någon slags lista på vilka av alla referenserna som gör vad eller kanske en förklaring kring vilka som är vanligast?
Nej ,inte direkt vad jag känner till (referenserna är ju inte alls specifika för VB utan en salig blandning av samtliga MS- och tredjepartslib som råkar finnas installerade på just den datorn). Det som gäller är nog "trial-and-error", läsa böcker, söka på nätet, MSDN och fråga andra.
En enklare grej man kan göra är ju att "på skoj" inkludera libbet och sen trycka F2. Därefter kan man utforska interfacet i Object Browsern. Namn på klasser och funktioner ger ju viss vägledning om vad libbet är tänkt att användas till (iaf ibland).
Erik Juhlin skrev:
Men jag hoppas att du är medveten om att detta är att synda
Köper inte riktigt det resonemanget. Kodar man specifikt för IIS:en så kan man naturligtvis länka till IIS-specifika lib. Kodar man inte specifikt för IIS:en så bör man så klart undvika det. Konstigare är det inte.
Annars kan man ju lika gärna säga att man "syndar" varje gång man inte kodar i Ansi-C eller Java?
OveRRidEMedlem sedan feb. 200112 078 inlägg
Erik Juhlin skrev:
Detta funkar fint:
Option Explicit
Private ctx As ASPTypeLibrary.ScriptingContext
'Automatically called when object is instantiated
Public Sub OnStartPage(ASP_Scripting_Context _
As ASPTypeLibrary.ScriptingContext)
'Set global variable so we can reference
'scripting context in other functions and subs
Set ctx = ASP_Scripting_Context
End Sub
'Automatically called when object is instantiated
Public Sub OnEndPage()
Set ctx = Nothing
End Sub
'just in case...
Private Sub Class_Terminate()
Set ctx = Nothing
End Sub
Public Sub DoStuff()
ctx.Response.Write "foo"
End Sub
Men jag hoppas att du är medveten om att detta är att synda och är något man inte bör ta för vana att göra. ;)
Jag får inte detta att fungera..
I min modul:
Public ctx As ASPTypeLibrary.ScriptingContext
'Automatically called when object is instantiated
Public Sub OnStartPage(ASP_Scripting_Context As ASPTypeLibrary.ScriptingContext)
'Set global variable so we can reference
'scripting context in other functions and subs
Set ctx = ASP_Scripting_Context
End Sub
Public Function GetApplicationVar(strVariableName As String) As Variant
[b][red]GetApplicationVar = ctx.Application.Value(strVariableName) [/b][/red]
End Function
Object variable or With block variable not set
nikoMedlem sedan juni 20022 599 inlägg Hur instansierar du ditt objekt? Det låter ju som om OnStartPage aldrig anropas.
(Sen behöver knappast ctx vara Public, fast det har ju inget med problemet att göra.)
OveRRidEMedlem sedan feb. 200112 078 inlägg
niko skrev:
Hur instansierar du ditt objekt? Det låter ju som om OnStartPage aldrig anropas.
Hela COM-objektet menar du, eller vad? Som vanligt, isf.
När körs OnStartPage och vad krävs för att den skall köras? Jag har testat att lägga den koden i en annan sub som jag kör manuellt, men det fick jag inte heller att fungera.
nikoMedlem sedan juni 20022 599 inlägg
När körs OnStartPage och vad krävs för att den skall köras?
Den körs när IIS:en anropar den. Du måste alltså skapa din instans med:
X.CreateObject("dinDll.dinKlass")
Där X är en referens av typen ASPTypeLibrary.ScriptingContext.Server. Om du instaniserar klassen direkt i en ASP-sida så blir det alltså:
[b]Server[/b].CreateObject("dinDll.dinKlass")
OveRRidEMedlem sedan feb. 200112 078 inlägg Jo, tack. Så mycket vet jag, och så gör jag också. :)
nikoMedlem sedan juni 20022 599 inlägg Ja, isåf ska det ju funka .. Har du kollat att OnStartPage verkligen körs?
Public Sub OnStartPage(ASP_Scripting_Context As ASPTypeLibrary.ScriptingContext)
ASP_Scripting_Context.Response.Write "Vi är inne i OnStartPage."
' osv ..
End Sub
OveRRidEMedlem sedan feb. 200112 078 inlägg Näe, den körs aldrig, för det skrivs inte ut nåt.
OnStartPage ligger i min modul, inte klassmodul, är det fel? Det borde vara fel, nu när jag tänker efter.
OveRRidEMedlem sedan feb. 200112 078 inlägg När jag flyttade över onStartPage till min klassmodul och skrev ut en text, så visades den (och kördes givetvis).
Men när jag försöker anropa 'ctx' från modulen, säger den 'object required'.
nikoMedlem sedan juni 20022 599 inlägg
Men när jag försöker anropa 'ctx' från modulen, säger den 'object required'.
Ja, men det beror väl på att den är deklarerad i class-filen. Men varför vill du egentligen referera direkt till den i funktionerna i bas-modulen? Skicka in den som en parameter i funktionsanropen istället.
OveRRidEMedlem sedan feb. 200112 078 inlägg Men då finns det ett problem.
Koden som skall komma åt applikationsvariabeln ligger i modulen 'dataHandler'. I denna ligger även denna funktion:
Public Function GetApplicationVar(strVariableName)
GetApplicationVar = ctx.Application.Value(strVariableName)
End Function
.
Problemet är att getApplicationVar enbart behöver anropas innifrån modulen och därför kan inte context-objektet skickas in som parameter från klassmodulen (där den instansieras i onStartPage), då inga anrop sker från klassmodulen.
Förstår du? Det kanske snarare är ett gränssnittsproblem för mig. Kan inte ctx bli globalt global (eller nåt) så att den går att komma åt överallt?
OveRRidEMedlem sedan feb. 200112 078 inlägg Ok, jag testade med följande kod:
Public Function getApplicationVar(strVariableName)
Dim contX As ASPTypeLibrary.ScriptingContext
getApplicationVar = contX.Application(strVariableName)
End Function
, men det fungerade inte. Den klagar på tredje raden och säger 'Object variable or With block variable not set'.
nikoMedlem sedan juni 20022 599 inlägg I teorin så finns det ju inget som hindrar att du definierar ctx inne i basmodulen. Men annars borde det väl fungera att referera till den som DittKlassnamn.ctx oavsett om den är private eller public. Har inte testat men det "känns" rimligt ..
/red: Inser att jag kanske missuppfattade lite. Du talar om en annan klassmodul och inte en bas-modul. Eller hur?
OveRRidEMedlem sedan feb. 200112 078 inlägg Japp. Som det står ovan (?) så är det en klassmodul och en modul. Att inte publika objekt kan ränna mellan dessa finner jag lite konstigt, men det finns säkert en bra anledning. :)
Varför fungerar inte koden ovan, tror du?
RED. Eller nja.. vänta lite nu. En klassmodul och en modul. Inte två bas-moduler. Nu missuppfattade jag nog lite..
nikoMedlem sedan juni 20022 599 inlägg Ja, nu blev jag förvirrad på ett ganska högt plan. Du har en COM-dll som består av en klassmodul och en basmodul. Och getApplicationVar ligger var ..?
OveRRidEMedlem sedan feb. 200112 078 inlägg getApplicationVar ligger i modulen, för att jag skall kunna komma åt den överallt ifrån sedan.
OnStartPage ligger i klassmodulen, eftersom den inte kördes när den låg i modulen.