[VB6 met C# .NET] Callback vanuit C# naar VB6

Pagina: 1
Acties:

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 22-05 17:18
Ola,

na lange tijd java geprogrammeerd te hebben probeer ik nu mijzelf wegwijs te maken in microsoftland. Als case heb ik een leuke opdracht mee gekregen. Ik moet vanuit VB6 een call doen naar een c# .Net programma doen. Vanuit dit c# programma moet er een CallBack volgen, terug naar de UserInterface dus.

De reden van een CallBack is dat de c# code een uur bezig moet kunnen zijn zonder dat de UserInterface daar last van heeft. Wat ik er tot nu toe van begrepen heb is dat ik de UserInterface, geschreven in VB6, niet kan laten wachten totdat de c# code klaar is, omdat in die situatie de UserInterface niet meer kan reageren.

Dus simpel gezegd. UI roept c# aan en gaat verder. C# verwerkt de call en komt in actie, indien klaar c# roept UI aan.

Dit alles moet ook nog eens via sockets gaan werken, omdat gebleken is dat dit de snelste oplossing is. Ik dacht al een oplossing gevonden te hebben door gebruik te maken van het SOAP-protocol. Dit bleek dus te langzaam te zijn.

Mijn vraag is dan ook, hoe maak ik vanuit c# een aanroep naar een VB applicatie.?

Ik wil bij voorbaat al om vergeving vragen als het hier en daar wat vaag is. Waar dit het geval is probeer ik het te verduidelijken indien nodig.

Groetjes


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Is het C# programma een bestaand programma of moet je die ook zelf maken (of kan je die aanpassen)?

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 22-05 17:18
uhmz....Hoe ga ik dit makkelijk beschrijven. Heb nog een beetje last van het klok-en-klepel-syndroom.

Er is een bestaande situatie.

((UI)-berichtenbuffer)-(SERVER)-(DB)

Hierbij is de UI in VB6 en de SERVER in java. Het is van belang dat de gegevens van de server zsm op de ui verschijnen.

Om dit te realiseren is er nu voor een oplossing gekozen die per client meerdere ActiveX componenten opstart om naar de server te luisteren. Deze ActiveX componenten luisteren naar de server op een socket. Zodra ze iets binnenkrijgen dan wordt dit op een berichten stack geplaats. De UI kijkt vervolgens naar de berichtenstack om te kijken of er nieuwe berichten binnen gekomen zijn.

Het nadeel hiervan is dat wanneer er meerdere channels naar de server geopend zijn we 3*aantal channels + 1 activex componenten op moeten starten voor de berichtenbuffer.

Dit willen we oplossen door de berichtenbuffer in .NET te gaan schrijven(dus ja, het is nieuw). Hierdoor hoeven per client slechts 1 Object de lucht in te schieten ipv. soms 14 losse programma's.

<edit>
Is het mogelijk om een com object te "delen" tussen C# en VB6? Ik heb gelezen dat de lifecycle van een com-object afhankelijk is van de referencecount. Betekend dat, dat ik van verschillende app-domains calls kan maken op één en hetzelfde com-object?

En is het mogelijk om het com object events te laten spugen naar het juiste programma.

[ Voor 22% gewijzigd door yrew op 23-08-2004 15:58 ]

Groetjes


  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 22-05 17:18
Last try ;)

Gisteren was ik nog in het duister aan het tasten. Vandaag nog in de schemering.

Het betreft hier een monitoringsprogramma. Clients moeten dus realtime datum ontvangen.

Ik heb nu een Java server met een VB6 UserInterface. Om de data op het scherm te krijgen start ik aan de clientzijde een activeX.exe op om te luisteren op een socket. De activeX zet dit vervolgens in een Queue. Vervolgens staat de Userinterface te pollen naar de Queue. Dit is een zogenaamde pull methode.

Om bovenstaande pull methode te laten werken heb ik per te monitoren systeem 3 activeX.exe + 1. Dit gaat op den duur de spuigaten uit lopen.

Nu ben ik op zoek naar een zogenaamde PUSH methode. Zelf ben ik op het idee gekomen om een Dll te maken die subroutines van de UserInterface registreerd als Callback. In de dll wil ik een nieuwe thread opstarten die de socket raadpleegt. Op het moment dat er data via de socket binnenkomt moet de callback methode getriggered worden.

Zit ik hiermee op de goede weg. Of zijn er wellicht andere mogelijkheden. :7

Groetjes


  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 22-05 17:18
Ik zit nu wat te spelen met callback functies. Momenteel een klein voorbeeldje geimplementeerd dat de huidige windows opsomt en terug geeft. Hierbij schoot meteen de volgende vraag door mijn hoofd:

Als ik vanuit vb6 een functie met een callback aanroep in een dll, wacht vb6 dan net zolang totdat de dll klaar is en zijn callback functie aanspreekt?


Geen verkapte kick. Alleen een nieuw topic openen vond ik een beetje te veel van het goede voor zo'n korte vraag.

Groetjes


Verwijderd

Waarom start je niet gewoon een nieuwe thread in VB die je C# functie aanroept, dan heb je dat hele geneuzel van callback functions niet nodig.

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 22-05 17:18
Ga je me nou vertellen dat VB6 wel multithreaded is? Dacht van niet namelijk. Sterker nog ik was er heilig van overtuigd dat dit niet het geval was.

Groetjes


Verwijderd

yrew schreef op 25 augustus 2004 @ 11:59:
Ga je me nou vertellen dat VB6 wel multithreaded is? Dacht van niet namelijk. Sterker nog ik was er heilig van overtuigd dat dit niet het geval was.
Nouja ik heb geen ervaring met VB maar lijkt me toch wel dat dit mogelijk moet zijn. Google levert iig de nodige hits op.
http://www.freevbcode.com/ShowCode.asp?ID=4029

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 22-05 17:18
THANX, ik heb even gekeken en ook eens hier op got gezocht. Wat ik lees over vb6 en multithreading is niet zo mooi. Daar ga ik me ook niet aan wagen denk ik. Ga het morgen nog even wat verder bekijken, want het is al wat laat. Maar echt positief zijn de meeste er niet over.

edit.

Bedankt voor de moeite, maar vb is bij lange na niet thread-safe. Als 1 thread hangt, dan hangt de hele applicatie. Ook heb ik nog geen constructie gevonden om te garanderen dat variabelen slechts door 1 thread tegelijk benaderd kunnen worden en that is spooky.

[ Voor 103% gewijzigd door yrew op 26-08-2004 10:26 ]

Groetjes


Verwijderd

Je kunt het beste je c# object implementeren als COM object. Op die manier kun je vanuit VB met CreateObject() een instantie oproepen die zelf multithreaded kan zijn of events opwerpen etc.. Voorbeelden zijn in MSDN te vinden, bijv op http://msdn.microsoft.com...l/vclrfsamplecomclass.asp.


Je kan alternatief ook een activeNiX control maken. zie http://www.c-sharpcorner....03/March/ActiveXInNet.asp
voor een voorbeeld.

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 22-05 17:18
YEAH Thanx

Ik ben hier nu inderdaad mee bezig. Dit klinkt noobisch, maar een com object zit gewoon in een dll toch? Ik ben nog niet zo bekend met de termen, maar ik ben nu met een dll bezig, die inderdaad in VB geinstantieerd wordt.

Waar ik alleen nog niet uit ben. Hoe kan ik binnen C# globale variabelen declareren binnen mijn dll. Het is namelijk de bedoeling dat dit stukje gaat zorgen als een soort van proxy tussen de client en de server. Hierdoor moet zowel de serverside als de clientside de dll instantieeren. Het zou dan wel erg handig zjin als ze beiden de pointers van elkaar kunnen vinden.

Ik dacht gewoon aan static variabelen en dat ga ik morgen dan ook gewoon proberen. Zoeken heb ik opgegeven, vandaag zo'n zes uur aan besteed, ligt vast aan mij :-)

Groetjes


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
VB6 zelf is erg non-multithreaded, en het is erg verstandig dat je niet een of andere ranzige hack gebruikt om het dat wel te maken.
Sterker nog, ( je hebt het nu over een COM object ), als je vanuit VB een COM object instantieert ( ' AxtiveX dll' in VB6, of een COM dll in C++ ) en je laat die vanuit een andere thread een callback doen naar je container ( een event bijvoorbeeld ) dan krijg je de meest rare effecten. De beste is dat je VB6 app crashed, maar dat hoeft niet. )

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.


  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 22-05 17:18
Hmmz, I luv vb6.

Farlane, als ik je post goed begrijp is het zelfs niet verstandig. Om vanuit die dll events te throwen naar de ui?

Groetjes


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
yrew schreef op 27 augustus 2004 @ 09:59:
Hmmz, I luv vb6.

Farlane, als ik je post goed begrijp is het zelfs niet verstandig. Om vanuit die dll events te throwen naar de ui?
Zolang ze maar in dezelfde thread zitten als waarin VB de dll heeft geladen is er niets aan de hand.

Maar zou je bijvoorbeeld een multimediatimer gebruiken in je dll, en vanuit de callback van de timer een event gooien naar VB dan gaat het verkeerd. De multimediatimer callback zit namelijk in een andere thread dan de thread waarin ie gestart is.

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.


  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 22-05 17:18
Maar dan zou je hem alsnog eerst naar de main-thread van de dll en kunnen gooien en dan een event afvuren?

Heb het nu eindelijk aan de gang met een simpele reken dll in c#. Ik zal binnekort de code ff posten.

Groetjes


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
yrew schreef op 27 augustus 2004 @ 22:01:
Maar dan zou je hem alsnog eerst naar de main-thread van de dll en kunnen gooien en dan een event afvuren?

Heb het nu eindelijk aan de gang met een simpele reken dll in c#. Ik zal binnekort de code ff posten.
Dat is inderdaad een mogelijkheid. De simpelste is ( in Win32 ) een message only window aan te maken in de hoofdthread, en die een custom message sturen vanuit de aparte thread. Vanuit de message handler kun je dan je event versturen.

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.

Pagina: 1