Hej på er, jag sitter o gör en activeX.exe-komponent. Hej Bertil, Kan inte lova dig att du får det svar du önskar för jag har inte testat själv. Hej, tack för länken, den var dock svårläst för min del, förstår inte så jättemycket... Har du möjligtvis lite exempelkod på hur du försöker läsa värdet? Det kanske är så att du kopplar upp dig fel mot komponenten? hej, ursäkta om jag tog bort min kod innan, den var felande, här kommer den kod jag kör: Hej, Hej. Hej igen, Förresten, Hej igen, jag antar att du inte ens har VB6 installerat? Jag har enbart den kod du såg ovan och komponenten som är extra är winsock. Så har du VB6 installerat KAN du testköra helt utan vidare, bara du har en mailserver o koppla emot. Hej, Men herregud, den kod du fick är VISST bara att klippa och klistara, sen lägger du dit ett formulär o en winsock. Mer är det inte. Kan inte förstå varför du är så otrevlig mot Johan. Jag är inte otrevlig, jag ifrågasätter det han skriver, kan du hålla med om att han inte ens verkar förstå vad winsock ÄR för nått? Inget ont i det men han ifråga sätter ju min kod, frågar vilken "gömd bakomliggande kod" som finns mm, sänder winsock en förfrågan så hamnar det på ett ställe i den kontrollens kod, inget JAG skapat. Alla som hållt på med winsock VET att det funkar så och HAR man VB6 installerat så ingår winsock. jag BAD någon om att testa om DOM VILLE. Bara för att förstå vad jag menar då jag från början inte kunde förklara ordentligt enligt mig själv.har kört fast med en activeX.exe.
Det min testfil gör nu är att ansluta till min mail o kollar antalet. inga problem.
Det jag sedan vill göra är att ge en publik variabel värdet (antalet mail) o sen få ut det från applikationen som anropar. Detta går inte.
Jag har testat att skapa en funktion i activeX:en som får samma värde (antal mail) o sen anropa funktionen men det verkar inte bli nått.
Kan jag inte få ut ett värde ur en activeX.exe? Om jag lägger in en msgbox med värdet direkt i activeX:en så går det bra men så ville jag inte ha det.
"Har Du förståååt?" (citat Baloo)
/BSv: har kört fast med en activeX.exe.
Det finns något som kallas MultiUse. En läsning som kanske kan komma tillhand är http://www.vb-helper.com/howto_activex_dll.html i ämnet. Jag har inte själv läst igenom hela själv, men hoppas du hittar något matnyttigt där.Sv:har kört fast med en activeX.exe.
Jag får väl ta fram stora ordboken eller nått. Synd att det inte finns sidor som denna på svenska:(
/BSv: har kört fast med en activeX.exe.
Det är lättare att felsöka om du postar vad som går fel (kod) och hur det går fel (felmeddelande el.dyl.)
// JohanSv:har kört fast med en activeX.exe.
i progget som anropar och som jag vill ha värdet till:
<code>
Private Sub Form_Load()
Dim strtest As String
Set mydllobjekt = CreateObject("mail.class1")
strtest = mydllobjekt.getmailcount
MsgBox strtest '*** HÄR VILL JAG HA STRdata att visas******
End Sub
</code>
min DLL (OBS det är en DLL nu, inte en EXE.)
<code>
Public Function GetMailCount()
Form1.Winsock1.Connect "min.mailserver.se", "110"
End Function
</code>
Detta går fint, kod nedan funkar oxå bra: (i activeX:en)
<code>
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
dim strdata as string
Static usersent As Boolean
Static passent As Boolean
Static listsent As Boolean
Winsock1.GetData STRData
If Left(STRData, 1) = "-" Then MsgBox "Det gick åt helsike": Exit Sub
If usersent = False Then Winsock1.SendData ("User " & "min@mail.se" & vbCrLf): usersent = True: Exit Sub
If passent = False Then Winsock1.SendData ("Pass " & "mittlösen" & vbCrLf): passent = True: Exit Sub
If listsent = False Then Winsock1.SendData ("stat" & vbCrLf): listsent = True: Exit Sub
If listsent = True Then MsgBox STRData
End Sub
</code>
det ovan funkar OM jag har en msgbox i form_load i progget som anropar, även om denna inte visar nått, då visar msgboxen ovan STRdata korrekt. tas msgboxen i form_load bort visas inget i den ovan heller.
Dessutom vill jag nu ha det värdet STRdata tillbaka-skickat till progget som anropar.
Jag kan se att det blir fel då koden stannar i winsock-kontrollen, den kan inte ge nått tillbaka men hur gör jag?
Ta koden om ni vill o testa me.
/BSv: har kört fast med en activeX.exe.
Till att börja med spelar det ingen roll om det är en ActiveX EXE eller ActiveX DLL. Skillnaden dem emellan är enbart hur programmet laddas och minnet utnyttjas (in-process eller out-of-process execution). I båda fallen går det att returnera data.
Ditt problem ligger i att du faktiskt INTE returnerar någon data. Du kör funktionen, men har ingen retur...
Din funktion:
<code>
Public Function GetMailCount()
Form1.Winsock1.Connect "min.mailserver.se", "110"
End Function
</code>
Här har du inget returvärde deklarerat och du försöker heller inte skicka tillbaka något. Jag kan faktiskt inte heller se att du försöker läsa något värde, bara att du anropar en annan kodsnutt.
Jag skulle göra något i stil med följande:
<code>
Public Function GetMailCount() as Long
Dim lngMyRet AS Long
lngMyRet=Form1.Winsock1.Connect("min.mailserver.se", "110")
GetMailCount = lngMyRet
End Function
</code>
Dvs, nu förutsätter jag att den kodsnutt i Connect returnerar ett värde. Om inte så ändra enligt vad som funkar hos dig. Om du bara vill testa att skicka värde, vilket som helst, så returnera en konstant eller nåt, tills du felsökt hela flödet.
Förresten, eftersom du kör det hela som DLL skall du aldrig använda messageboxar i DLL-filen, eftersom dessa oftast inte visas, utan istället får programmet att hänga sig elelr ger andra lustiga effekter.
Lycka till!
// JohanSv:har kört fast med en activeX.exe.
Helt riktigt så gör denna funktion inte nått annat än att anropa en annan:
<code>
Public Function GetMailCount()
Form1.Winsock1.Connect "min.mailserver.se", "110"
End Function
</code>
Ditt förslag antar jag att du inte testat då jag får fel i denna:
<code>
Public Function GetMailCount() as Long
Dim lngMyRet AS Long
lngMyRet=Form1.Winsock1.Connect("min.mailserver.se", "110")
GetMailCount = lngMyRet
End Function
</code>
"Type missmatch" får jag på "connect" så det gick inte.
"Dvs, nu förutsätter jag att den kodsnutt i Connect returnerar ett värde. Om inte så ändra enligt vad som funkar hos dig. Om du bara vill testa att skicka värde, vilket som helst, så returnera en konstant eller nåt, tills du felsökt hela flödet."
Det är ju just DETTA jag har problem med.
Helt riktigt vill jag inte ha msgboxar i min dll.
Jag vill ha tillbaka värdet i "STRdata" när jag anropar "getmailcount" från min vanliga app.
Jag har inga problem annars me o få tillbaka värden från dll:er men i detta fall känner jag mig blind på varför det inte går. Koden stannar när winsock är klar, då ligger mitt data i STRdata.
/BSv: har kört fast med en activeX.exe.
Det är riktigt att jag inte testkört, beroende på att jag inte har hela dinkod och alla dina komponenter, varför jag helt enkelt inte kan testköra. Mina resonemang håller sig därför på en konceptuell nivå, vilket innebär att du får anpassa mina kommentarer till hur din verklighet ser ut.
Nåja, det jag reagerade på är att du i din exe fil har en kodarad enligt följande:
<code>
strtest = mydllobjekt.getmailcount
</code>
Denna kodrad förutsätter att din function GetMailCount faktiskt returnerar ett värde, vilket din version inte gjorde. Min tolkning var därför att visa att detta är nödvändigt.
Om jag nu skall dra vidare slutsater utfirån namnen på dina olika funktioner så antar jag att din Winsock1.Connect inte gör annat än just kopplar upp sig. Dvs, denna läser i sig ingen data. (Det är också därför du får type mismatch.)
Vad jag kan se så initieras inte läsningen av data någonstans. Du har förvisso en funktion, Winsock1_DataArrival, som verkar göra någon form av läsning, men denna verkar inte anropas någonstans. Av namnet att döma så verkar denna vara styrd av ett event, men var triggas det eventet? Inte från någon synlig del av koden iallafall.
Kanske har du glömt att posta vissa delar av din kod, jag vet inte. Men som det ser ut så försöker ditt huvudprogram att läsa data från en funktion som inte returnerar någon data. Denna funktion i sin tur skapar bara en uppkoppling utan att försöka läsa, varför den inte kan returnera ens om den skulle vilja.
En annan sak jag reagerar på är att du från din dll anropar en kontroll på ett formulär. Har du formulär i din dll? Det är i sig en märklig konstruktion. Om du nu gör detta som en DLL så bör den inte ha något GUI alls.
Så för att summera, du verkar vara beroende på att vissa saker skall "råka" hända, saker som du inte har kontroll över.
Jag forstätter gärna att ge kommentarer och analysera, men du får nog poste mer delar av din kod samt förklara lite tydligare exakt vilket flöde du tänkt dig och var de olika sakerna skall hända. (Jag har upptäckt att ofta om man skall förklara i detalj för någon annan så upptäcker man själv var man har tänkt fel.)
// JohanSv:har kört fast med en activeX.exe.
En liten sak slog mig (aj...).
Du skriver att du får datat senare än vad du önskar. Kan det vara så att du kör asynkron läsning, som inte läser när man begär det, utan först då man frågar efter resultatet? Lösningen isåfall är att antingen koppla om till att köra synkront eller att köra en dummy som begär resultatet utan att använda, så att det ligger cache:at till nästa anrop.
// JohanSv: har kört fast med en activeX.exe.
formuläret beror på winsock, jag kunde inte komma på nått sätt att ansluta till mailservern utan winsock & winsock krävde ett formulär som jag såg det.
Vore kul om fler kunde lägga sig i här då jag inte känner att jag få så stor hjälp här.
Johan konstaterar redan det jag vet.
Om inte nån annan kan komma med förslag gör jag helt enkelt så att jag sparar värdet i en databas av nått slag och hämtar från den istället.
/BSv:har kört fast med en activeX.exe.
>Hej igen, jag antar att du inte ens har VB6 installerat? Jag har enbart den kod du såg ovan och
>komponenten som är extra är winsock. Så har du VB6 installerat KAN du testköra helt utan vidare,
>bara du har en mailserver o koppla emot.
Nja, riktigt så enkelt är det inte. I VB 6 kan man gömma en massa inställningar i olika kontroller och liknande, därför kan man inte bara rakt av flytta kod gemom att klippa och klistra. Annat är det i VB.Net där allting skapas med koden. Och jodå, jag har både VB 6 och VB.Net installerat.
>formuläret beror på winsock, jag kunde inte komma på nått sätt att ansluta till mailservern utan
>winsock & winsock krävde ett formulär som jag såg det.
Det är sant att om man använder en kontroll så måste man ha ett formulär. Däremot finns det en klass för ändamålet också som man hellre bör använda i DLL:er. Tyvärr kommer jag inte ihåg namnet på den just nu, och med din inställning i övrigt så vet jag inte om jag är road av att leta upp det heller.
>då jag inte känner att jag få så stor hjälp här.
>Johan konstaterar redan det jag vet.
Jo, den tackar jag för. Jag ger dig de svar som är möjliga utifrån den information du ger. I mitt senaste inlägg t.ex. så påpekade jag att det inte är klart på något vis varifrån din eventstyrda metod anropas, när och hur. Som jag påpekade kan detta vara en av knutarna som löser hela problemet om man reder ut denna. Men det är klart, vill man inte ha hjälp så kan man skriva som du gör.
Och om du visste de svar jag redan har gett, t.ex. att du försöker få ett värde från en funktion som inte returnerar något, varför har du då inte rättat detta? Ärligt talat så hade jag uppskattat om du hade bemödat dig med att fundera igenom vad jag skriver istället för att gnälla när man faktiskt försöker hjälpa.
// JohanSv: har kört fast med en activeX.exe.
Winsock funkar ju så, om du inte vet det, att när man gör en anslutning "winsock.connect" så kommer det saker i winsock_DataArrival, det händer helt själv, så funkar det ju. Det är ju DÄR jag får värdet STRDATA som är själva retursträngen från det man ansluter sig till.
SÅ enkelt ser JAG att det är.
"Det är sant att om man använder en kontroll så måste man ha ett formulär. Däremot finns det en klass för ändamålet också som man hellre bör använda i DLL:er. Tyvärr kommer jag inte ihåg namnet på den just nu, och med din inställning i övrigt så vet jag inte om jag är road av att leta upp det heller."
Gör inte det då! Jag letar själv för som jag sa innan, du talar om det problem jag redan VET.
"så påpekade jag att det inte är klart på något vis varifrån din eventstyrda metod anropas, när och hur"
Se hur winsock funkar!
Alltså, för att börja om med min fråga:
I min winsock-kontroll hamnar data från min anslutning.
Denna winsock ligger i ett formulär i en DLL.
Denna data vill jag ha returnerat.
Jag har givit ALL kod som finns i mitt lilla test och ÄR enbart att klippa och klistra, jag har till o med standardnamnen.
Gör så här:
Starta VB6-välj activeX.dll- lägg till ett formulär (form1) och lägg dit en winsock1, klistra in koden ovan för DLL:en.
Starta e´tt nytt VB6-proj, vanlig exe med form1. klistra in den koden som anropar DLL:en.
Få datat som DLL:en får i sista skedet att pressenteras i det vanliga EXE-projektet.
Fattar inte varför jag inte kan få den hjälpen?
Jag VET att jag ska returnera värdet och har FÖRSÖKT men jag står still där. Det blir TOMT.
värdet stannar kvar i winsock och kommer inte vidare. HUR gör jag det?
Funkar inte detta inlägg då vetefasen vad jag inte kan förmedla.
Inställning JAG har?
/BSv:har kört fast med en activeX.exe.
<b>>Fattar inte varför jag inte kan få den hjälpen?</b>
Förstår du inte att folk är här frivilligt och själva väljer vad de vill göra. Att du i princip kräver att någon ska bemöda sig med att testa din kod är ju löjligt.
Om du ställer frågor får du förvänta dig att folk som faktiskt hjälper dig på eget bevåg måste sätta sig in i problemet. Jag har följt tråden och det har verkat precis på det sättet som Johan har svarat.
<b>>Inställning JAG har?</b>
Ja, DU!
Hur som helst, varför kan du inte ha en global variabel strdata som du använder i GetMailCount istället?
Kan man inte ha det i ActiveX-DLLer?
Eller är problemet att värdet kommer för sent, för att winsocken körs parallellt?
Om man inte skulle kunna ha globala variabler måste det ju vara väldigt lätt att lösa med en funktion med statiska. Vad menar du med att "koden stannar"?Sv: har kört fast med en activeX.exe.
Jag fattar VISST att folk hjälper andra på frivillig basis och jag har aldrig KRÄVT men när någon som Johan gör, sätter sig ner o ska hjälpa till o det inte funkar, varför kan jag då inte få säga det?
Han har gång på gång ifrågasatt saker som jag ALDRIG sätt nån ifrågasätta, klipp o klistra kod tex, det går VISST. All kod finns där.
Som jag sa, jag har testat globala variabler OCH funktioner men nånstans blir det ju snett, jag får antagligen testa SJÄLV då ingen verkar ORKA o testa min LILLA KOD.
Koden stannar när winsock fått sista returen från mailservern, det e helt normalt. hur jag ska få "getmailcont" det värdet har jag svårt att se då det jag testat inte funkar.
jag har tilldelat "getmailcont" STRdata när winsock är klar, det verkar inte funka, kanske för att den kör parallelt eller nått, den hinner kanske inte med.
jag har testat med nån funktion, jag har testat att anropa dll:en en andra gång mot en annan funktion men som jag ser det "dör" ju DLL:en när anropet är klart och variabler töms.
Om ingen har lust att hjälpa mig med det jag verkligen har problem med så tackar jag för mig denna gång och löser det på nått annat vis. allt går. Tar bara längre tid och är kanske inte optimalt.
/B- som förmodligen inte får mer hjälp ALLS nu då....