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
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?
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. ;)
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. ;)
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?
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
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.
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
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.
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?
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'.
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?
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..