[VB.Net] Service vertoont geen teken van leven

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mavamaarten
  • Registratie: September 2009
  • Laatst online: 18:29

Mavamaarten

Omdat het kan!

Topicstarter
Beste medetweakers,

Vandaag liep ik (weeral) tegen een dom probleem aan. Gisteren (eergisteren ?) heb ik een sync programma gemaakt. Vandaag wilde ik het automatiseren, zodat het automatisch mijn telefoon synct zodra ik het via USB koppel. Het dedecteren is makkelijk : Zodra ik de telefoon koppel (in android) verschijnt de "M:\" letter bij deze computer.

De code die ik nu heb luidt als volgt :

code:
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
34
35
36
37
38
39
40
41
42
Public Class Service1

    Dim PrevVal As Boolean
    Dim MyLog As New EventLog()

    Protected Overrides Sub OnStart(ByVal args() As String)
        Timer1.Enabled = True
        If Not MyLog.SourceExists("Msync") Then
            MyLog.CreateEventSource("Msync", "Msync Service log")
        End If
        MyLog.Source = "Msync"
        MyLog.WriteEntry("Msync Service log", "Service started at " & CStr(Now), EventLogEntryType.Information)
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If My.Computer.FileSystem.DirectoryExists("M:\") <> PrevVal Then
            If My.Computer.FileSystem.DirectoryExists("M:\") Then
                'just connected
                PrevVal = True

                If Not MyLog.SourceExists("Msync") Then
                    MyLog.CreateEventSource("Msync", "Msync Service log")
                End If
                MyLog.Source = "Msync"
                MyLog.WriteEntry("Msync Service log", "Phone connected at " & CStr(Now), EventLogEntryType.Information)

            End If
            If Not My.Computer.FileSystem.DirectoryExists("M:\") Then
                'just disconnected
                PrevVal = False

                If Not MyLog.SourceExists("Msync") Then
                    MyLog.CreateEventSource("Msync", "Msync Service log")
                End If
                MyLog.Source = "Msync"
                MyLog.WriteEntry("Msync Service log", "Phone disconnected at " & CStr(Now), EventLogEntryType.Information)

            End If
        End If
        PrevVal = My.Computer.FileSystem.DirectoryExists("M:\")
    End Sub
End Class


Timer1 staat ingesteld op interval 1000, en ik heb hem enabled. (ook in de code voor de veiligheid)

Maar : als ik mijn service start verschijnt er netjes in het logboek dat de service is gestart. Verder doet hij niets, of ik nu koppel of ontkoppel, hij doet niets. Bij deze computer zie ik de M:\ netjes verschijnen.

De code heb ik getest in een gewone windows forms applicatie, hier werkte de code perfect.
Ik heb ook al geprobeerd een mogelijke error op te vangen, en in geval van een error "ERROR" te laten schrijven in het logboek, maar nergens verschijnt een error.
Ook een aantal windowsgeluiden laten horen (my.computer.audio.playsystemsound) doet niets.

Als er iemand weet hoe ik mijn service tot leven kan wekken, zal ik hem heel dankbaar zijn _/-\o_

Android developer & dürüm-liefhebber


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
De service draait waarschijnlijk niet onder je useraccount maar onder SYSTEM of iets dergelijks en die zal geen M: schijf hebben (of een andere letter) dus dat gaat niet bepaald werken ;) Een quick'n'dirty workaround is de service onder je useraccount laten draaien, maar dan ga ik er even van uit dat je dit projectje voor jezelf wil gaan houden.

Een wat robuustere manier is waarschijnlijk een-of-ander (USB) device(drive)-connected oid event afvangen. Welke dat precies is is een kwestie van even MSDN in duiken.

[ Voor 20% gewijzigd door RobIII op 08-02-2011 22:44 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Mavamaarten
  • Registratie: September 2009
  • Laatst online: 18:29

Mavamaarten

Omdat het kan!

Topicstarter
Ik heb al geprobeerd bij ServiceInstaller (?) de service op user te zetten, maar dit helpt niet.
Ook heb ik al getest of shell() werkt, en dat werkt dus niet. Process.start() doet ook niets.
Ik wil gewoon als "M:\" aangekoppeld wordt, dat Msync.exe dan wordt gestart. Dit gebeurt dus niet.

Zou ik dit gewoon oplossen door een windows forms app te maken en deze te hiden ? Wel weer een extra process erbij, ik heb er al zoveel ;(

[ Voor 19% gewijzigd door Mavamaarten op 08-02-2011 23:06 ]

Android developer & dürüm-liefhebber


Acties:
  • 0 Henk 'm!

  • spone
  • Registratie: Mei 2002
  • Niet online
Ik denk dat je aan de gang moet met Interop services en P/invoke, waarbij je de RegisterDeviceNotification events afvangt, en daarbij kijkt of de telefoon inmiddels aangesloten is, bijvoorbeeld aan de hand van de device id en vendor id. Dit wordt ook op http://www.developerfusio...38/making-usb-c-friendly/ beschreven, misschien kom je daar verder mee. Anders http://www.dotnet247.com/247reference/msgs/32/164968.aspx :)

[ Voor 14% gewijzigd door spone op 08-02-2011 23:13 ]

i5-14600K | 32GB DDR5-6000 | RTX 5070 - MacBook Pro M1 Pro 14" 16/512


Acties:
  • 0 Henk 'm!

  • Mavamaarten
  • Registratie: September 2009
  • Laatst online: 18:29

Mavamaarten

Omdat het kan!

Topicstarter
Bedankt voor de link, ik denk dat ik dat deel wel opgelost krijg. Maar verder, hoe "shell" ik een nieuw process ?
Shell werkt niet en Process.Start ook niet. Google levert alleen dezelfde vragen op, geen antwoorden ;(

Android developer & dürüm-liefhebber


Acties:
  • 0 Henk 'm!

Verwijderd

RobIII schreef op dinsdag 08 februari 2011 @ 22:43:
De service draait waarschijnlijk niet onder je useraccount maar onder SYSTEM of iets dergelijks en die zal geen M: schijf hebben (of een andere letter) dus dat gaat niet bepaald werken ;)
Dit gaat meestal over netwerk toegang, de telefoon zal een USB aansluiting zijn, is wel interessant om te kijken hoe een service daarmee overweg gaat eigenlijk. Je zou eigenlijk (weet ff niet uit het hoofd, heb de delphi code liggen) het event moeten afvangen van het aankoppelen van een USB drive (M:\ in jouw user omgeving), echter in je service omgeving kan dit N:\ zijn, via dit event kan je achterhalen welke letter is toegewezen (ik doe ditzelfde in Delphi in een gewone App).

ps. Of je nu een service of applicatie draait, het blijft een proces :)

hier staat wat .Net code:
MSDN: Get notification of CD or USB stick insert in WPF application

[ Voor 10% gewijzigd door Verwijderd op 08-02-2011 23:18 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Mavamaarten schreef op dinsdag 08 februari 2011 @ 23:03:
Ik heb al geprobeerd bij ServiceInstaller (?) de service op user te zetten, maar dit helpt niet.
Ga gewoon eens bij services.msc bij je service kijken onder welke user je service draait; als je de installer hebt aangepast maar de service niet eerst hebt verwijderd draait 'ie waarschijnlijk nog gewoon onder system.
Verwijderd schreef op dinsdag 08 februari 2011 @ 23:15:
[...]

Dit gaat meestal over netwerk toegang, de telefoon zal een USB aansluiting zijn, is wel interessant om te kijken hoe een service daarmee overweg gaat eigenlijk. Je zou eigenlijk (weet ff niet uit het hoofd, heb de delphi code liggen) het event moeten afvangen van het aankoppelen van een USB drive (M:\ in jouw user omgeving), echter in je service omgeving kan dit N:\ zijn, via dit event kan je achterhalen welke letter is toegewezen (ik doe ditzelfde in Delphi in een gewone App).
Dat is toch precies wat ik zeg? Als de service user niet overeenkomt met de user waar je de M: schijf ziet dan gaat 't (waarschijnlijk) niet werken omdat voor de service user een andere (of zelfs geen) driveletter toegekend kan worden.
Verwijderd schreef op dinsdag 08 februari 2011 @ 23:15:
ps. Of je nu een service of applicatie draait, het blijft een proces :)
Ja, behalve dat een service niet desktop-interactive is (by default) om maar eens wat te noemen ;)

[ Voor 57% gewijzigd door RobIII op 08-02-2011 23:18 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Mavamaarten
  • Registratie: September 2009
  • Laatst online: 18:29

Mavamaarten

Omdat het kan!

Topicstarter
Als ik alles instel op "Dit account" (dus user) bij services.msc, dan krijg ik
Afbeeldingslocatie: http://img1.uploadscreenshot.com/images/orig/2/3817211872-orig.jpg

Ik denk dat ik alles gewoon als windows forms applicatie ga doen. Mijn code werkt daarop wel, en het is toch alleen voor mijn GSM bedoeld.

Toch bedankt voor jullie moeite.

Android developer & dürüm-liefhebber


Acties:
  • 0 Henk 'm!

Verwijderd

RobIII schreef op dinsdag 08 februari 2011 @ 23:16:
[...]

Dat is toch precies wat ik zeg? Als de service user niet overeenkomt met de user waar je de M: schijf ziet dan gaat 't (waarschijnlijk) niet werken omdat voor de service user een andere (of zelfs geen) driveletter
hm, ja idd :) las er beetje overeen, als ik de woorden Service, System user en netwerk (eventueel met) <driveletter>: zie, denk ah, geen netwerk :)

Overigens zal TS er mee geholopen zijn om wat meer error/excpetion handling te doen, een service kan er bij een exception zomaar helemaal mee kappen, en dat zie je niet altijd zo 123 even snel terug.

[edit].
zie ^^^screenshot ;)
Pagina: 1