[vb6] Winsocket aanmaken in een class

Pagina: 1
Acties:

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Topicstarter
Zoals er al velen voor mij hebben geprobeerd wil ook ik een Winsocket object aanmaken in een class en dus zonder het gebruik van een form. Momenteel heb ik in mijn project een reference naar Microsoft Winsock Control 6.0 (SP5) en gebruik ik deze code om het object aan te maken (alleen de relevante code getoond):
Visual Basic:
1
2
3
4
5
Private WithEvents objWinsock As MSWinsockLib.Winsock

Private Sub Class_Initialize()
  Set objWinsock = New MSWinsockLib.Winsock
End Sub
Deze code werkt perfect op mijn eigen machine en op die van een collega VB-ontwikkelaar. Als ik de applicatie uitvoer op een andere PC waar geen Visual Basic 6 op staat geinstalleerd dan krijg ik de fijne melding "ActiveX component can't create object".

Ik heb al geprobeerd om de mswinsck.ocx van mijn PC op de PC te zetten waar geen VB op staat, ik heb de registries van de twee machines met elkaar vergeleken maar niks van dit alles levert enig resultaat op.

Heeft iemand enig idee waaraan het zou kunnen liggen dat ik niet het object kan aanmaken op een PC waar geen VB6 op staat geinstalleerd?

  • Markieman
  • Registratie: December 2001
  • Laatst online: 10-05 07:43
de .ocx dient geregistreerd te worden mbv regsvr32.exe

ie:

regsvr32.exe "c:\winnt\system32\mswinsck.ocx"

You do not fear them? - The Wraith? Naah. Now *clowns*, that's another story.


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Topicstarter
Markieman schreef op vrijdag 11 maart 2005 @ 12:19:
de .ocx dient geregistreerd te worden mbv regsvr32.exe

ie:

regsvr32.exe "c:\winnt\system32\mswinsck.ocx"
Ik dacht dat die actie zo vanzelf sprekend was dat ik 'em niet heb vernoemd. Uiteraard heb ik dit wel gedaan!

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Heb je wel de VB runtime op het doelsysteem staan?
Hij is onder andere te vinden op MSDN

My personal website


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Topicstarter
OZ-Gump schreef op vrijdag 11 maart 2005 @ 12:59:
Heb je wel de VB runtime op het doelsysteem staan?
Hij is onder andere te vinden op MSDN
Ja, die staat er wel op. Anders zou natuurlijk mijn hele applicatie niet draaien, toch? :)

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Lorn schreef op vrijdag 11 maart 2005 @ 13:11:
[...]

Ja, die staat er wel op. Anders zou natuurlijk mijn hele applicatie niet draaien, toch? :)
Ik heb wel eens meegemaakt dat ik daarover alleen gezeur kreeg bij bepaalde functies van een applicatie. Maar volgens mij had dat er meer mee te maken dat de installatie niet helemaal fris was... ;)

Zoeken op Google Groups (wat overigens enorm veel topics oplevert) maakt duidelijk dat het registreren van de OCX niet voldoende is. Er moet meer gebeuren. Oplossing: maak een installatie met WinSock erin zodat alle files automatisch meegenomen worden, of bekijk welke bestanden er allemaal nodig zijn voor WinSock.

Iemand anders refereert rechtstreeks naar een DLL die blijkbaar nodig is:
The installer doesn't include scrrun.dll which is required for scripting.
Add it manually and it should fix the problem.

My personal website


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Topicstarter
OZ-Gump schreef op vrijdag 11 maart 2005 @ 13:26:
[...]

Ik heb wel eens meegemaakt dat ik daarover alleen gezeur kreeg bij bepaalde functies van een applicatie. Maar volgens mij had dat er meer mee te maken dat de installatie niet helemaal fris was... ;)

Zoeken op Google Groups (wat overigens enorm veel topics oplevert) maakt duidelijk dat het registreren van de OCX niet voldoende is. Er moet meer gebeuren. Oplossing: maak een installatie met WinSock erin zodat alle files automatisch meegenomen worden, of bekijk welke bestanden er allemaal nodig zijn voor WinSock.

Iemand anders refereert rechtstreeks naar een DLL die blijkbaar nodig is:
[...]
Ik zal dit zeker proberen maar het lijkt me onwaarschijnlijk dat het de oplossing is. We hebben het hier namelijk op 3 Windows XP SP2 machines geprobeerd, op 2 werkt het wel en op een niet. Volgens mij is winsock toch gewoon een standaard onderdeel van het OS? Dat ik de OCX heb gecopieerd was echt een last ditch effort...

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 10-05 10:05
Anders kijk ff met depends wat de ocx nog meer nodig heeft.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Kuhlie
  • Registratie: December 2002
  • Niet online
OZ-Gump schreef op vrijdag 11 maart 2005 @ 13:26:
(...)


Iemand anders refereert rechtstreeks naar een DLL die blijkbaar nodig is:
The installer doesn't include scrrun.dll which is required for scripting.
Add it manually and it should fix the problem.
Dat zou dan vbscript 5.6 ofzo zijn. Installeer dat eens op de doelcomputer en kijk of het dan ineens wel werkt. Wel raar hoor: normaal gesproken zou je dan ook daadwerkelijk onder Project, References het vakje voor "Microsoft Scripting Runtime" aan moeten klikken, voordat je dat kunt gebruiken. Ik betwijfel dus of het dat is.

Edit: sowieso: wat heb je allemaal aangevinkt staan in Project, References? Met jouw code kan ik namelijk helemaal niet zomaar een instantie van MSWinsockLib.Winsock maken: Invalid use of New keyword.

[ Voor 23% gewijzigd door Kuhlie op 11-03-2005 14:33 ]


  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Topicstarter
In het References scherm van VB zie ik het vinkje niet meer staan van de Microsoft Winsock Control. Het vreemde is dat de reference nog wel staat in de .vbp file. Op mijn machine werkt het testproject gewoon en op een niet VB machine krijg ik de ActiveX fout.

Ik heb het hele testproject (alle 6 regels code) gezipt en online gezet, wie zin heeft is meer dan welkom om het eens te proberen. Mijn ervaring is dat het niet werkt op PC's waar geen VB op staat geinstalleerd. Het testproject is hier te downloaden.

Ik ben nog aan het kijken naar de resultaten van de Google link die OZ-Gump heeft gepost. Tot nu toe nog geen oplossing gevonden. Wel even gekeken naar de license entry in de registry. Na het mergen van de key nog geen verschil gezien maar misschien is er wel een reboot nodig.

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Topicstarter
Microsoft heeft een artikel dat precies beschrijft wat er bij mij mis gaat. Hier staat het allemaal in beschreven. Wordt ik dus gedwongen om een form aan te maken dat nergens voor dient anders dan als een winsock container... bah :(

  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 19-03 00:48

ZaZ

Tweakers abonnee

een container is niets mis mee hoor. heb je wel vaker nodig voor dingen.
Winsock is idd een standaard onderdeel van het OS, maar de OCX die vb6 als control gebruikt om het makkelijker aan te spreken niet.
persoonlijk vind ik het niet zo netjes om als je het op andere systemen gaat draaien zomaar COM objecten te gaan reggen met regsvr32
je kan imho beter detecteren of ie er al goed op staat en in geval van niet het tijdelijk te reggen.
pseudo code:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
Private Const ERROR_SUCCESS = &H0
Private Const ERROR_BAH = &HF

Public Function RegisterCOMFile(hWnd As Long, sRegFile As String, bRegister As Boolean) As Long
On Local Error Resume Next
Dim lhRegFile As Long, lpProcAddress As Long

lhRegFile = LoadLibrary(sRegFile)
If lhRegFile = Null Then RegisterCOMFile = ERROR_BAH

If bRegister Then
  lpProcAddress = GetProcAddress(lhRegFile, "DllRegisterServer")
Else
  lpProcAddress = GetProcAddress(lhRegFile, "DllUnregisterServer")
End If

If CallWindowProc(lpProcAddress, hWnd, ByVal 0&, ByVal 0&, ByVal 0&) = ERROR_SUCCESS Then
  RegisterCOMFile = ERROR_SUCCESS
Else
  RegisterCOMFile = ERROR_BAH
End If
FreeLibrary lhRegFile
End Function

dan kan je het gewoon bij het opstarten eventueel reggen en bij het afsluiten mooi weer unreggen :)

je kan ook ff op zoek gaan naar een mooie class die Emiliano Scavuzzo <anshoku AT yahoo.com> heeft geschreven.
weet niet meer waar ik 'm vandaan heb maar zijn naam/email stond in zijn code.
dan heb je het Winsock control van Vb6 niet meer nodig

Lekker op de bank

Pagina: 1