Hej, Har du reggat komponenterna i MTS så dom kan nås av IIS/ASP? Jag har reggat dem i Component Services där jag har lagt upp en egen applikation och där i har jag lagt dem. Kan det kanske vara så att jag helt enkelt gör en dundertabbe vid kompileringen... *hmmm* Det beror på vad du sagt i Projekt/References Lutar åt att det var kompileringen som blivit fel, för nu funkar det "oförklarligt." Kan ha missat project compability tidigare. Hej anonyma Martin. Active X cant create object
sitter med ett litet projekt som i korthet ser ut som nedan.
MS-SQL2000 som databas.
Tvåskiktade componenter skrivna i VB som körs som en Com+-applikation.
De två komponenterna heter ppp_bc resp ppp_db.
bc-klienten tar emot värden från en ASP-sida och typkonverterar och kontrollerar längd mm och skickar sedan vidare variablerna i ett funktionsanrop till db-komponenten som tar emot dem, skapar ett commandobject och sist men inte minst returnerar ngt, ett värde som visar om det gick bra/dåligt om det är en insert och ett recordset om det är fråga om en get-funktion.
Nu till problemet.
Får upp nedanstående felmeddelande på asp-sidan när jag försöker köra en av funktionerna (en insert).
ppp_bc error '800a01ad'
ActiveX component can't create object
/ppp/test/test3.asp, line 17
På line 17 sker anropet till bc-komponenten. Dock om jag strax innan kontrollerar om man kan skapa ett objekt av den komponenten så kan man det - så jag gissar att felet egentligen ligger någonannanstans.
Om jag i VB addar ett .exe-projekt och anropar bc-komponenten därifrån så är det inga problem, då skickar den snyggt vidare till db, lägger till posten och returnerar att det gick bra. Så det är bara från asp-sidan jag har problem.
Vet inte vad som egentligen är relevant för att ni åp enklast möjliga sätt kan hjälpa mig, men skickar med lite av anropen:
------------------
Från ASP (anrop till ppp_bc.dll):
dim ret
dim objUtbOrg
set objUtborg = Server.CreateObject("ppp_bc.bcUtbOrg")
-->om man gör isobject(objUtbOrg) får man svaret TRUE
ret = objUtborg.AddUtbOmr("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k)
-------------------
I ppp_bc-komponenten:
Public Function AddUtbOmr(ByVal varOrgNamn As Variant, _
ByVal varAdress As Variant, _
ByVal varPostNr As Variant, _
ByVal varOrt As Variant, _
ByVal varTelefon As Variant, _
ByVal varFax As Variant, _
ByVal varKontaktperson As Variant, _
ByVal varEmail As Variant, _
ByVal varFakturaAdress As Variant, _
ByVal varFakturaPostNr As Variant, _
ByVal varFakturaOrt As Variant) As Long
Dim objUtbOrg As Object
(här har jag sett att en del tar "as new komponentnamn" - vad är skillnaden?)
' skapa objekt av db-komponenten
Set objUtbOrg = CreateObject("ppp_db.dbUtbOrg")
AddUtbOmr = objUtbOrg.AddUtbOmr(strOrgNamn, strAdress, strPostNr, strOrt, strTelefon, strFax, strKontaktperson, strEmail, strFakturaAdress, strFakturaPostNr, strFakturaOrt)
---------------------------------
I ppp_db komponenten:
Public Function AddUtbOmr(ByVal strOrgNamn As String, _
ByVal strAdress As String, _
ByVal strPostNr As String, _
ByVal strOrt As String, _
ByVal strTelefon As String, _
ByVal strFax As String, _
ByVal strKontaktperson As String, _
ByVal strEmail As String, _
ByVal strFakturaAdress As String, _
ByVal strFakturaPostNr As String, _
ByVal strFakturaOrt As String) As Long
Dim cmdObject As ADODB.Command
' skapar commandobjectet
Set cmdObject = CreateObject("ADODB.Command")
cmdObject.CommandType = adCmdStoredProc
cmdObject.CommandText = "tblUtbildningsorg_insert"
cmdObject.ActiveConnection = gstrCon
' sätter upp parametrarna
cmdObject.Parameters.Append cmdObject.CreateParameter("Return", adInteger, adParamReturnValue, 4, lngRetVal)
cmdObject.Parameters.Append cmdObject.CreateParameter("orgnamn", adVarChar, adParamInput, 50, strOrgNamn)
cmdObject.Parameters.Append cmdObject.CreateParameter("adress", adVarChar, adParamInput, 50, strAdress)
cmdObject.Parameters.Append cmdObject.CreateParameter("postnr", adVarChar, adParamInput, 5, strPostNr)
cmdObject.Parameters.Append cmdObject.CreateParameter("ort", adVarChar, adParamInput, 50, strOrt)
cmdObject.Parameters.Append cmdObject.CreateParameter("telefon", adVarChar, adParamInput, 20, strTelefon)
cmdObject.Parameters.Append cmdObject.CreateParameter("fax", adVarChar, adParamInput, 20, strFax)
cmdObject.Parameters.Append cmdObject.CreateParameter("kontaktperson", adVarChar, adParamInput, 60, strKontaktperson)
cmdObject.Parameters.Append cmdObject.CreateParameter("email", adVarChar, adParamInput, 50, strEmail)
cmdObject.Parameters.Append cmdObject.CreateParameter("fakturagatuadress", adVarChar, adParamInput, 50, strFakturaAdress)
cmdObject.Parameters.Append cmdObject.CreateParameter("fakturaPostNr", adVarChar, adParamInput, 5, strFakturaPostNr)
cmdObject.Parameters.Append cmdObject.CreateParameter("fakturaort", adVarChar, adParamInput, 50, strFakturaOrt)
' kör commandobjektet
cmdObject.Execute
' kod för att returnera svaret
-----------------------------------
Så... det blev väl kanske ett lite långt inlägg men tror väl att det ni kan behöva veta för att hjälpa mig finns med här.
Jo förresten, kompileringen är gjord med först "no compability", sedan "project" och sist "binary".
I och med att jag får "isobject" på asp-sidan så räknar jag med att Com+ tjänsten funkar som den skall osv. Har även en annan komponent som hanterar fel men som är enkelskiktad och den fungerar fullt ut, så miljön i sig är det (troligen) inget fel på.Sv: Active X cant create object
/PelleSv: Active X cant create object
Den "enkelskiktade" felhanteringskomponenten har jag inget som helst problem med, och jag kan även skapa ett object av den första komponenten (ppp_bc) så visst borde jag väl ha kontakt med dem?
Funderar på om det kan vara en referens mellan komponenterna innan jag kompilerade dem som gör att de inte funkar - och i och med att man kör dem i VB-miljö vid andra testet så funkar de där då det väl egentligen inte är dll:erna som används där!?
I listan för referenser ser jag nu (kollade aldrig där igår - fick ideén under natten) att där faktiskt finns flera referensinstanser med samma namn. Kan man på ngt sätt "refresha" referenslistan så att man blir av med de andra? Verkar som att när man kompilerar att man får en ny referensmöjlighet per /kompilering.
mvhSv: Active X cant create object
Sätts referensen mellan komponenterna till den först kompilerade komponenten eller till dess VB-projekt?Sv: Active X cant create object
Tänk på att slå på binärkompatibiliteten oxå
/johan/Sv: Active X cant create object
Frågan är - behöver man kompilera om men no-, project- och slutligen binary varje gång man gör en ändring i någon av de två komponenterna nu? Eller räcker det att man kompilerar om en av dem?Sv: Active X cant create object
Beror på vilka förändringa du gör. Om du bara ändrar på kod i en funktion och behåller binär kompabilitet behöver du bara kompilera om projektet du har ändrat i.
Om du däremot förändrar ett objekt. T.ex. lägger till ett argument i en av classens metoder eller lägger till en metod eller egenskap till en classerna kommer du att bryta den binära kompabiliteten. Vilket innebär att du antingen kompilerar om ditt projekt och alla applikationer som använder din komponent.
Annars finns det många sätt att lösa det på. Tyvärr något begränsat i vb. Om man ser hur microsoft löser förändringar av t.ex ADO. Så är det ju bara senaste versionen som är installerad men kan användas av applikationer kompilerade med tidigare version. Detta beror på att classerna implementerar tidigare gränssnitt på så sätt håller dem ADO binärt kompatibel.