Ik onderhoud een grote VB6 applicatie welke aanpassingen nodig heeft. Nu wil ik het liefst zoveel mogelijk van deze wijzigingen in VB.NET maken zodat ik mij langzaam aan kan focussen op het migreren van de volledige applicatie naar VB.NET. "Langzaam" moet hierbij zeer letterlijk worden genomen. Het is de bedoeling dat de applicatie mondjesmaat wordt gemigreerd waarbij de werking continu gegarandeerd blijft. Je kunt dit zien als stapsgewijs ieder form omzetten en werkend maken in een VB.NET COM Library die vervolgens weer in de bestaande VB6 code aangeroepen kan worden. Dit brengt echter de nodige problemen met zich mee en ik hoop dat iemand hier ervaring mee heeft en mij een duwtje in de goede richting kan geven.
Probleem: Vanuit een .NET Form lijkt het onmogelijk om een werkend VB6 Form te openen.
Ik heb een .NET COM Visible Library gemaakt waarin een form is verwerkt. Deze form heeft een knop die als doel heeft een bestaand VB6 form te openen. Omdat ik vanuit .NET niet rechtstreeks naar VB6 kan verwijzen heb ik een event aangemaakt die wordt getriggerd als er op de knop wordt gedrukt. In VB6 maak ik een event handler die reageert op het betreffende event en vervolgens het juiste VB6 form opent. Dit geeft wisselende resultaten afhankelijk van de threads in de .NET library.
Zelfde thread: Als ik de callback stuur vanuit de thread waarmee het .NET form is geopend dan krijg ik zowaar een VB6 form te zien. Daar is ook alles mee gezegd want het form werkt niet. Het venster reageert nergens op en de inhoud die ik via het Onload event van het form zelf toevoeg ontbreekt. Ook het drukken op knoppen werkt niet. Het lijkt er zogezegd op dat alle events in het VB6 form niet functioneren. De VB6 debugger geeft hierbij geen enkele fout aan.
Nieuwe thread (via Threading.Thread of een BackgroundWorker): Als ik de callback stuur vanuit een nieuwe thread die door het .NET form is gestart dan wordt de VB6 code uitgevoerd totdat deze bij het openen van het VB6 form uit komt. De VB6 debugger geeft de volgende foutmelding: Invalid procedure call or argument
Het vreemde hierin is ook dat in beide gevallen het openen van een Msgbox in VB6 wel weer werkt.
Na flink zoeken kwam ik uit op de Microsoft Interop Form Toolkit. Deze wordt al lang niet meer ondersteund maar is met wat omwegen werkend te krijgen in Visual Studio 2019. Deze kit maakt het mogelijk om .NET forms "compatible" te maken met VB6 zodat je de forms rechtstreeks vanuit VB6 kan openen. Ik heb dit getest en de toolkit doet wat het belooft. Echter, het probleem blijft bestaan. Events of callbacks vanuit het .NET form werken prima maar kunnen geen VB6 Forms aansturen.
Ik vermoed dat het iets te maken heeft met het werken in een andere thread. Dit lijk je ook te kunnen zien in de taakbalk omdat het .NET form een eigenlijk applicatie-plekje krijgt toegewezen ondanks dat het een Modal Form is. Vergelijk dit met een standaard VB6 Modal Form en je zal zien dat die nooit een eigenlijk taakbalk vermelding krijgen. Een andere aanwijzing is dat breakpoints in VB6 worden geraakt maar dat die de VB6 UI niet pauzeren. In VB.NET kun je ook de UI niet aansturen vanuit een andere thread dus misschien kun je het daar mee vergelijken. De vraag is dan hoe ik de VB6 UI thread kan invoken, als dat al kan.
Ik heb naar mijn idee alle StackOverflow en vbforums berichten al gelezen die hier iets mee te maken hebben. De meeste vragen gaan echter over de mogelijkheid om .NET forms te openen. Niet over de feedback van die forms richting de aanroepende VB6 applicatie. Ja, events en callbacks zijn mogelijk maar die kunnen geen VB6 Forms aansturen. En dat is nu net wat ik nodig heb. Er zijn echter heel veel topics met vergelijkbare keywords dus misschien heb ik de juiste zoekterm nog niet gevonden.
Mijn grote vraag is dus: Hoe kan ik vanuit een .NET Form een VB6 Form openen die ook daadwerkelijk functioneert?
Probleem: Vanuit een .NET Form lijkt het onmogelijk om een werkend VB6 Form te openen.
Ik heb een .NET COM Visible Library gemaakt waarin een form is verwerkt. Deze form heeft een knop die als doel heeft een bestaand VB6 form te openen. Omdat ik vanuit .NET niet rechtstreeks naar VB6 kan verwijzen heb ik een event aangemaakt die wordt getriggerd als er op de knop wordt gedrukt. In VB6 maak ik een event handler die reageert op het betreffende event en vervolgens het juiste VB6 form opent. Dit geeft wisselende resultaten afhankelijk van de threads in de .NET library.
Zelfde thread: Als ik de callback stuur vanuit de thread waarmee het .NET form is geopend dan krijg ik zowaar een VB6 form te zien. Daar is ook alles mee gezegd want het form werkt niet. Het venster reageert nergens op en de inhoud die ik via het Onload event van het form zelf toevoeg ontbreekt. Ook het drukken op knoppen werkt niet. Het lijkt er zogezegd op dat alle events in het VB6 form niet functioneren. De VB6 debugger geeft hierbij geen enkele fout aan.
Nieuwe thread (via Threading.Thread of een BackgroundWorker): Als ik de callback stuur vanuit een nieuwe thread die door het .NET form is gestart dan wordt de VB6 code uitgevoerd totdat deze bij het openen van het VB6 form uit komt. De VB6 debugger geeft de volgende foutmelding: Invalid procedure call or argument
Het vreemde hierin is ook dat in beide gevallen het openen van een Msgbox in VB6 wel weer werkt.
Na flink zoeken kwam ik uit op de Microsoft Interop Form Toolkit. Deze wordt al lang niet meer ondersteund maar is met wat omwegen werkend te krijgen in Visual Studio 2019. Deze kit maakt het mogelijk om .NET forms "compatible" te maken met VB6 zodat je de forms rechtstreeks vanuit VB6 kan openen. Ik heb dit getest en de toolkit doet wat het belooft. Echter, het probleem blijft bestaan. Events of callbacks vanuit het .NET form werken prima maar kunnen geen VB6 Forms aansturen.
Ik vermoed dat het iets te maken heeft met het werken in een andere thread. Dit lijk je ook te kunnen zien in de taakbalk omdat het .NET form een eigenlijk applicatie-plekje krijgt toegewezen ondanks dat het een Modal Form is. Vergelijk dit met een standaard VB6 Modal Form en je zal zien dat die nooit een eigenlijk taakbalk vermelding krijgen. Een andere aanwijzing is dat breakpoints in VB6 worden geraakt maar dat die de VB6 UI niet pauzeren. In VB.NET kun je ook de UI niet aansturen vanuit een andere thread dus misschien kun je het daar mee vergelijken. De vraag is dan hoe ik de VB6 UI thread kan invoken, als dat al kan.
Ik heb naar mijn idee alle StackOverflow en vbforums berichten al gelezen die hier iets mee te maken hebben. De meeste vragen gaan echter over de mogelijkheid om .NET forms te openen. Niet over de feedback van die forms richting de aanroepende VB6 applicatie. Ja, events en callbacks zijn mogelijk maar die kunnen geen VB6 Forms aansturen. En dat is nu net wat ik nodig heb. Er zijn echter heel veel topics met vergelijkbare keywords dus misschien heb ik de juiste zoekterm nog niet gevonden.
Mijn grote vraag is dus: Hoe kan ik vanuit een .NET Form een VB6 Form openen die ook daadwerkelijk functioneert?