[C++/ASP] Enkele instantie programma

Pagina: 1
Acties:
  • 121 views sinds 30-01-2008
  • Reageer

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Ik heb een programma geschreven in BCB6 en deze wilde ik vanuit de browser kunnen besturen, hierom heb ik aan dit programma een Active Server Page toegevoegd, zodat deze te besturen is met ASP (out of process). Dit werkt allemaal prima, het programma is te besturen met ASP.

Nu gebruikt de ASP server (IIS 5) voor anonieme gebruikers een andere login naam dan dat ik ben ingelogd, en in dit geval start de asp pagina een nieuwe instantie op van het programma en gaat deze proberen te gebruiken in plaats van de instantie die al draait. Dit probleem treed niet op als ik meerdere ASP pagina's het zelfde programma gebruik laat maken zolang ik maar op dezelfde PC de pagina's aanroep.

Hoe kan ik nu voorkomen dat het programma meerdere malen wordt gestart? Ik heb zelf al de documentatie door lopen graven, maar hierin heb ik niets kunnen vinden dat ik kan laten werken. (b.v. de instancing of threading opties veranderen).

Alvast bedankt!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Mutex.

Professionele website nodig?


  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Ja, mutex heb ik er al inzitten, maar dat helpt niet in mijn geval. Want hoe vertel ik dan de ASP pagina dat er al een instantie draait van het programma en dat hij die moet gaan gebruiken?

Ik bedoel het voorkomen van twee draaiende applicaties is het probleem niet, maar dat de ASP pagina gebruik maakt van de Active Server Object van het draaiende programma, in plaats van een nieuw programma te starten en deze te gebruiken?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

PKP B-Man schreef op 07 July 2003 @ 09:52:
Ja, mutex heb ik er al inzitten, maar dat helpt niet in mijn geval. Want hoe vertel ik dan de ASP pagina dat er al een instantie draait van het programma en dat hij die moet gaan gebruiken?
Houdt het bij in een Application Variabele? Misbruik deze en bouw een soort van Singleton.

[ Voor 6% gewijzigd door gorgi_19 op 07-07-2003 09:58 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

* curry684 snapt het niet helemaal... :?

Kun je eens duidelijk op een rij zetten welke onderdelen op welke computers in welke taal wanneer draaien en welke je daarvan 'static' wil houden? Volgens mij kun je dit nl. met standaard Win32 synchronizatie gewoon oplossen...

Professionele website nodig?


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22-08 01:56
Geef dan graag ook aan hoe je dat "programma" precies aanroept.

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Ik heb een programma draaien, deze draait altijd als een normaal programma op dezelfde server als de IIS. Dit programma is voorzien van een Active Server Object (COM/ActiveX?) welke de interface voor de ASP pagina verzorgt. Zodra het programma draait wil ik d.m.v. Server.CreateObject in de ASP-pagina een "verbinding" maken met dit programma.

Op de IIS server heb ik twee virtuele directories aangemaakt die beide naar dezelfde directory wijzen. Op een hiervan heb ik de anonieme toegang uitgeschakeld, bij de andere directory gebruikt deze de IUSR_ account voor de anonieme toegang.
Zodra ik nu verbinding maak op de server met de anonieme gebruiker dan zie ik in de taskmanager dat hij een nog een applicatie opstart en deze gaat proberen te gebruiken terwijl ik de applicatie al handmatig heb opgestart.
Als ik de virtuele directory gebruik zonder anonieme toegang dan doet hij het wel goed, hij gebruikt dan het handmatig opgestarte programma.
Ook als ik het uitvoeren van executables aanzet in IIS en dan eerst de executable start met de anonieme gebruiker vanuit de webbrowser en dan weer anoniem probeer te verbinden gaat het ook goed zolang ik maar anoniem blijf inloggen. Zodra ik nu weer met de niet anonieme gebruiker inlog, dan doet hij het weer niet... |:( |:(

Hetzelfde geld trouwens ook voor de mutex, de mutex werkt perfect zolang het programma maar gestart wordt via de ingelogde gebruiker, maar zodra ik het programma heb lopen draaien en via internet de applicatie ook uitvoer dan start hij de applicatie ook gewoon op :(

Mijn winmain uit borland (voor de mutex):
C++:
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
28
29
30
31
32
33
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{       using Forms::Application;
        // Attempt to create a mutex. If the mutex already existed,
        // GetLastError will return ERROR_ALREADY_EXISTS
        HANDLE hInstanceMutex = ::CreateMutex(NULL,TRUE, "PROGRAM_NAME");
        if(GetLastError() == ERROR_ALREADY_EXISTS)
        {   if(hInstanceMutex)
                CloseHandle(hInstanceMutex);
            Application->Terminate();
            return 0;
        }

        try
        {   Application->Initialize();
            Application->CreateForm(__classid(TMainForm), &MainForm);
            Application->Run();
        }
        catch (Exception &exception)
        {   Application->ShowException(&exception);
        }
        catch (...)
        {   try
            {   throw Exception("");
            }
            catch (Exception &exception)
            {   Application->ShowException(&exception);
            }
        }
        ReleaseMutex(hInstanceMutex);
        CloseHandle(hInstanceMutex);

        return 0;
}


En de asp file gebruikt:
ASP:
1
2
Set Obj = Server.CreateObject("xxx.yyy")
Obj.{Method/Property}

Ik hoop dat het duidelijk is zo, anders gewoon weer vragen ;)
Bedankt!

edit:
FF kort samengevat:
Applicatie: Borland C++ Builder 6.0
Webpagina: ASP
WebServer: Microsoft IIS 5.0
Applicatie draait al op achtergrond, ASP hoort verbinding te maken met het draaiende programma
ASP maakt verbinding met Server.CreateObject
Alles draait op 1 computer, andere computers verbinden via webbrowser/ASP

[ Voor 10% gewijzigd door PKP B-Man op 07-07-2003 11:32 ]


Verwijderd

PKP B-Man schreef op 07 July 2003 @ 11:24:
En de asp file gebruikt:
ASP:
1
2
Set Obj = Server.CreateObject("xxx.yyy")
Obj.{Method/Property}

Ik hoop dat het duidelijk is zo, anders gewoon weer vragen ;)
Bedankt!
Dit is volgens mij het probleem.
Ik weet niet zeker of dit ook van toepassing is op VB, maar je kan een OLE object pakken op 2 manieren. (In C++ in ieder geval)
Je hebt CreateObject en GetActiveObject.

CreateObject maakt een nieuwe instantie aan, terwijl GetActiveObject probeert een huidig actief object te vinden. (en als 'ie er geen vind gooit 'ie een exception)

Hier bijv een stukje code om 'n actief Word Basic object te pakken en een char* te inserten:
C++:
1
2
3
Variant V;
V = Variant::GetActiveObject("Word.Basic");
V.Exec(Procedure("Insert") << s);


Ik denk in ieder geval dat je dit je probleem is :)

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
Verwijderd schreef op 07 July 2003 @ 11:46:
[...]
Dit is volgens mij het probleem.
Ik weet niet zeker of dit ook van toepassing is op VB, maar je kan een OLE object pakken op 2 manieren. (In C++ in ieder geval)
Je hebt CreateObject en GetActiveObject.

CreateObject maakt een nieuwe instantie aan, terwijl GetActiveObject probeert een huidig actief object te vinden. (en als 'ie er geen vind gooit 'ie een exception)
Ik heb het nagezocht en in VBScript is dit GetObject ipv GetActiveObject. Maar helaas kwam ik in de documentatie het volgende tegen:
When using VBScript on the server with ASP, two VBScript features are disabled. Because scripts written with Active Server Pages are executed on the server, the VBScript statements that present user-interface elements, InputBox and MsgBox, are not supported. In addition, do not use the VBScript functions CreateObject and GetObject in server-side scripts. Use Server.CreateObject instead so that ASP can track the object instance. Objects created by CreateObject or GetObject cannot access the ASP built-in objects and cannot participate in transactions. The exception to this rule is when you are using the IIS Admin Objects, and when you are using Java monikers. For more information, see Using IIS Admin Objects and Creating an Object from a Java Class.
M.a.w. ik mag die optie niet gebruiken ;(
(Uiteraard heb ik het stieken toch geprobeerd, en als ik dat doe dan doet hij exact hetzelfde als Server.CreateObject)

Verwijderd

PKP B-Man schreef op 07 juli 2003 @ 13:32:
M.a.w. ik mag die optie niet gebruiken ;(
Hmm :|
Je kan anders moeilijk doen, en CreateObject gebruiken om een mini-applicatie op te starten die als een soort tussenpersoon functioneert tussen jouw script en je app.
Lijkt me in ieder geval mogelijk :P

  • PKP B-Man
  • Registratie: November 2002
  • Laatst online: 19-07-2023
AAAAAAAAAHHHH!!!!

|:( |:( |:(

Hoe kon ik nou zo dom zijn?!?!?!??!? 8)7

Ik weet niet waarom precies, maar de oplossing schoot me inees te binnen....
De oplossing is echt heeel erg simpel en logisch: "DCOMCNFG > Application Properties > Identity > Run as: This user" en geef maar aan als wie de applicatie moet worden gedraaid......

Misschien was het weekend iets te goed >:) 'T is tenslotte maandag.............

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 17:28

alienfruit

the alien you never expected

Een singleton pattern gebruiken :+

modbreak: spuit elf uithangen nadat alles is opgelost voegt weinig toe... :/

[ Voor 63% gewijzigd door curry684 op 07-07-2003 16:48 ]

Pagina: 1