2010-10-12 5 views
1

J'ai un service Windows C++, et j'aimerais accéder à un exécutable dans le même répertoire que l'exécutable du service (via la fonction système). J'imagine que pour faire cela, j'ai besoin de trouver ce répertoire, afin que je puisse me référer au chemin de l'exécutable cible. Comment puis-je trouver le répertoire dans lequel le service est installé, dans le code?Comment puis-je obtenir le répertoire installé pour un service Windows C++?

+0

Pour clarifier, vous voulez dire du service courant, pas d'une autre application arbitraire, correct? –

+0

C'est correct. –

Répondre

2

Dépend.

Si cela provient du service, vous pouvez toujours utiliser GetModuleFileName, ce qui produit un chemin qualifié complet.

S'il s'agit d'un autre programme, alors comme service, vous pouvez inspecter les informations de registre du service.

3

Comme d'autres l'ont mentionné, GetModuleFileName() peut faire ce travail mais YMMV. Le moyen le plus fiable consiste à lire ces informations à partir de la clé de registre HKLM\System\CurrentControlSet\Services\%ServiceName%\ImagePath%ServiceName% est un nom de votre service.

Pour un exemple de lecture du registre à l'aide de C++, vérifiez this out.

Bonne chance!

3

Vous pouvez utiliser la fonction QueryServiceConfig(). Le chemin vers le binaire est stocké dans le champ lpBinaryPathName de la structure QUERY_SERVICE_CONFIG.

+2

+1 - c'est la meilleure façon d'obtenir les informations 'officielles' –

+0

Cette fonction obtient effectivement des informations du registre. Mais le problème est que vous devez avoir une poignée de service, ce que je n'aime pas du tout. Le nom du service devrait être suffisant. –

+1

@Vlad: si vous allez sur la route du registre, vous aurez besoin d'un handle pour une clé de registre. La plupart des choses dans l'API Windows sont accessibles via des poignées. – Ferruccio