IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[API32] Librairie dynamique + variables d'environnement


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut [API32] Librairie dynamique + variables d'environnement
    Bonjour,

    Je suis confronté à un problème dont je n'arrive pas à trouver la solution.

    J'ai créé un programme qui:
    - Déclare des variables d'environnement,
    - Charge une librairie avec LoadLibrary
    - Appelle une fonction de cette librarie avec GetProcAddress

    Le code donne quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    if( !SetEnvironmentVariable("Variable1", "Value1") )
    {
        return 1;
    }
     
    if( !SetEnvironmentVariable("Variable2", "Value2") )
    {
        return 1;
    }
     
    HINSTANCE myLib = LoadLibrary( "MyLib.dll" );
    if( myLib != NULL )
    {
        my_func_type_t myFunc = (my_func_type_t) GetProcAddress( myLib, "_MYFUNC@144" );
        if( myFunc != NULL )
        {
            myFunc( ... );
            // Affiche: "Erreur, la variable d'environnement Variable1 n'est pas déclarée"
        }
        else
        {
            return 1;
        }
    }
    else
    {
        return 1;
    }
    La fonction appelée dans la librairie externe exige que les variables d'environnement soient déclarées. Sinon, je récupère un code d'erreur.
    Et justement, je récupère à chaque fois un code d'erreur comme quoi les variables d'environnement ne sont pas bien positionnées.

    Si je déclare directement les variables d'environnement dans Windows, tout ce passe bien, donc je pense qu'il n'y pas d'erreur dans la manière d'appeler la fonction.

    Je ne suis pas l'auteur de la librairie appelée, et je n'en possède pas le code source.

    Quelqu'un aurait une idée?

    Merci d'avance.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Tu es sûr que SetEnvironmentVariable() et les appels de fonction à ta DLL sont bien fait dans le même process ?

    Autre chose, en lisant l'aide de la fonction on peut lire :
    This function has no effect on the system environment variables or the environment variables of other processes.
    Ce ne serait pas un process système (un service quoi) auquel cas, tu ne peux modifier les variables d'environnement.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut
    Mon programme ne crée pas explicitement de process, mais la fonction appelée dans la DLL en crée un. Mais normalement ça ne devrait pas créer de problème, car normalement, quand on appelle CreateProcess, le nouveau process hérite de l'environnement du process parent (?)

    Pour répondre à ta deuxième question, la DLL en question n'est pas un service. C'est juste une DLL de calcul écrite en Fortran.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par nverbeke Voir le message
    Mon programme ne crée pas explicitement de process, mais la fonction appelée dans la DLL en crée un. Mais normalement ça ne devrait pas créer de problème, car normalement, quand on appelle CreateProcess, le nouveau process hérite de l'environnement du process parent (?)
    Peut être (ou pas ).

    As tu vu l'appel à CreateProcess() comment il est fait dans le code ? Il y a peut être un environnement spécifique qui est créé (avec un paramètre lpEnvironment qui n'est pas NULL).

    Autre chose, quand ton programme est lancé, il possède des variables d'environnement. Normalement, cet environnement est read-only, donc si le programme modifie cet environnement, peut être qu'il doit d'abord en créer un "personnel" (une copie de l'original) pour pouvoir ensuite le modifier.

    Après, lorsque tu fais ton CreateProcess, quel est le bloc de variables d'environnement qui est utilisé, l'original ou bien le modifié, je n'en sais rien mais cela mériterait un test.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Par défaut
    Ok, je pense que je commence à comprendre ce qui ne va pas...
    Si l'environnement est read-only, les appels à SetEnvironmentVariable n'ont aucun effet.
    En ce qui concerne l'appel à CreateProcess, je ne sais pas quels sont les paramètres car il est fait dans la Dll que j'appelle, et je n'ai pas le code source.
    Apparemment, je n'ai pas d'autre choix que de positionner les variables d'environnement dans Windows avant de lancer mon programme.
    En tout cas, merci pour ton aide.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par nverbeke Voir le message
    Si l'environnement est read-only, les appels à SetEnvironmentVariable n'ont aucun effet.
    Si mais que sur le process courant, j'essaierai de faire un test ce soir pour voir (pas d'environnement VisualStudio ici)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je viens de faire le test avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #include "stdafx.h"
    #include <windows.h>
     
    void _display(_TCHAR* envp[])
    {
    	for(int boucle = 0; envp[boucle] != NULL; boucle++)
    	{
    		_tprintf(L"%d : ENV %s\n", GetCurrentProcessId(), envp[boucle]);
    	}
    }
     
    int _tmain(int /*argc*/, _TCHAR* argv [], _TCHAR* envp[])
    {
    	TCHAR *progname = argv[0];
     
    	_display(envp);
    	if(SetEnvironmentVariable(L"truc", L"toto") != TRUE)
    	{
    		return 0;
    	}
     
    	if(argv[1] != NULL)
    	{
    		STARTUPINFO startup;
    		memset(&startup, 0, sizeof(startup));
    		startup.cb = sizeof(startup);
    		PROCESS_INFORMATION process;
    		if(CreateProcess(progname, progname, NULL, NULL, TRUE, 0, NULL, NULL, &startup, &process) == 0)
    		{
    			return 0;
    		}
    		Sleep(5000);
    	}
     
    	return 0;
    }
    C'est pas le plus beau code de ma vie mais il fait ce que je veux tester.

    Si on le lance avec un paramètre quelconque, il affiche les variables d'environnement (avec le numéro de process), positionne une nouvelle variable d'environnement (variable truc) et se relance (par CreateProcess()) sans paramètres (pour ne pas faire des lancements récursifs).
    En se relançant, il affiche les variables d'environnement et la variable "truc" existe bien.

    le résultat généré est le suivant :
    1180 : ENV ALLUSERSPROFILE=C:\ProgramData
    1180 : ENV APPDATA=C:\Users\Raymond\AppData\Roaming
    1180 : ENV CommonProgramFiles=C:\Program Files (x86)\Common Files
    1180 : ENV CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
    1180 : ENV CommonProgramW6432=C:\Program Files\Common Files
    1180 : ENV COMPUTERNAME=LUMI╚RE
    1180 : ENV ComSpec=C:\Windows\system32\cmd.exe
    1180 : ENV FP_NO_HOST_CHECK=NO
    1180 : ENV HOMEDRIVE=C:
    1180 : ENV HOMEPATH=\Users\Raymond
    1180 : ENV LOCALAPPDATA=C:\Users\Raymond\AppData\Local
    1180 : ENV LOGONSERVER=\\LUMI╚RE
    1180 : ENV NUMBER_OF_PROCESSORS=4
    1180 : ENV OS=Windows_NT
    1180 : ENV PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
    1180 : ENV PROCESSOR_ARCHITECTURE=x86
    1180 : ENV PROCESSOR_ARCHITEW6432=AMD64
    1180 : ENV PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 23 Stepping 10, GenuineIn
    tel
    1180 : ENV PROCESSOR_LEVEL=6
    1180 : ENV PROCESSOR_REVISION=170a
    1180 : ENV ProgramData=C:\ProgramData
    1180 : ENV ProgramFiles=C:\Program Files (x86)
    1180 : ENV ProgramFiles(x86)=C:\Program Files (x86)
    1180 : ENV ProgramW6432=C:\Program Files
    1180 : ENV PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
    1180 : ENV PUBLIC=C:\Users\Public
    1180 : ENV SESSIONNAME=Console
    1180 : ENV SystemDrive=C:
    1180 : ENV SystemRoot=C:\Windows
    1180 : ENV TEMP=C:\Users\Raymond\AppData\Local\Temp
    1180 : ENV TMP=C:\Users\Raymond\AppData\Local\Temp
    1180 : ENV USERDOMAIN=lumiÞre
    1180 : ENV USERNAME=Raymond
    1180 : ENV USERPROFILE=C:\Users\Raymond
    1180 : ENV VBOX_INSTALL_PATH=C:\Program Files\Oracle\VirtualBox\
    1180 : ENV VS100COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 10.0\Co
    mmon7\Tools\
    1180 : ENV VS80COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 8\Common
    7\Tools\
    1180 : ENV WecVersionForRosebud.13EC=2
    1180 : ENV windir=C:\Windows
    1180 : ENV _ACP_ATLPROV=C:\Program Files (x86)\Microsoft Visual Studio 8\VC\Bin\ATLProv.dll
    1180 : ENV _ACP_INCLUDE=C:\Programmes\boost\boost_1_46_0\;C:\Program Files\Micro soft SDKs\Windows\v7.1\Include;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\atlmfc\include;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK\include;C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\include
    1180 : ENV _ACP_LIB=C:\Program Files\boost\boost_1_46_0\stage\lib;C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\lib;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\atlmfc\lib;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\atlmfc\lib\i386;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK\lib;C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\lib;C:\Program Files (x86)\Microsoft Visual Studio 8\;C:\Program Files (x86)\Microsoft Visual Studio 8\lib
    1180 : ENV _ACP_PATH=C:\Program Files (x86)\Microsoft Visual Studio 8\VC\bin;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK\bin;C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools\bin;C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\tools;C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\ide;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\bin;C:\Windows\Microsoft.NET\Framework\v2.0.
    50727;C:\Program Files (x86)\Microsoft Visual Studio 8\;C:\Program Files (x86)\Microsoft Visual Studio 8\\SDK\v2.0\bin;C:\Windows\SysWow64;;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Microsoft Windows Performance Toolkit\
    1180 : ENV PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Microsoft Windows Performance Toolkit\;C:\Program Files (x86)\Microsoft Visual Studio 8\;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\bin
    520 : ENV ALLUSERSPROFILE=C:\ProgramData
    520 : ENV APPDATA=C:\Users\Raymond\AppData\Roaming
    520 : ENV CommonProgramFiles=C:\Program Files (x86)\Common Files
    520 : ENV CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
    520 : ENV CommonProgramW6432=C:\Program Files\Common Files
    520 : ENV COMPUTERNAME=LUMI╚RE
    520 : ENV ComSpec=C:\Windows\system32\cmd.exe
    520 : ENV FP_NO_HOST_CHECK=NO
    520 : ENV HOMEDRIVE=C:
    520 : ENV HOMEPATH=\Users\Raymond
    520 : ENV LOCALAPPDATA=C:\Users\Raymond\AppData\Local
    520 : ENV LOGONSERVER=\\LUMI╚RE
    520 : ENV NUMBER_OF_PROCESSORS=4
    520 : ENV OS=Windows_NT
    520 : ENV PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
    520 : ENV PROCESSOR_ARCHITECTURE=x86
    520 : ENV PROCESSOR_ARCHITEW6432=AMD64
    520 : ENV PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 23 Stepping 10, GenuineInt
    el
    520 : ENV PROCESSOR_LEVEL=6
    520 : ENV PROCESSOR_REVISION=170a
    520 : ENV ProgramData=C:\ProgramData
    520 : ENV ProgramFiles=C:\Program Files (x86)
    520 : ENV ProgramFiles(x86)=C:\Program Files (x86)
    520 : ENV ProgramW6432=C:\Program Files
    520 : ENV PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
    520 : ENV PUBLIC=C:\Users\Public
    520 : ENV SESSIONNAME=Console
    520 : ENV SystemDrive=C:
    520 : ENV SystemRoot=C:\Windows
    520 : ENV TEMP=C:\Users\Raymond\AppData\Local\Temp
    520 : ENV TMP=C:\Users\Raymond\AppData\Local\Temp
    520 : ENV truc=toto
    520 : ENV USERDOMAIN=lumiÞre
    520 : ENV USERNAME=Raymond
    520 : ENV USERPROFILE=C:\Users\Raymond
    520 : ENV VBOX_INSTALL_PATH=C:\Program Files\Oracle\VirtualBox\
    520 : ENV VS100COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 10.0\Com
    mon7\Tools\
    520 : ENV VS80COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 8\Common7
    \Tools\
    520 : ENV WecVersionForRosebud.13EC=2
    520 : ENV windir=C:\Windows
    520 : ENV _ACP_ATLPROV=C:\Program Files (x86)\Microsoft Visual Studio 8\VC\Bin\A
    TLProv.dll
    520 : ENV _ACP_INCLUDE=C:\Programmes\boost\boost_1_46_0\;C:\Program Files\Microsoft SDKs\Windows\v7.1\Include;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\atlmfc\include;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK\include;C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\include
    520 : ENV _ACP_LIB=C:\Program Files\boost\boost_1_46_0\stage\lib;C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\lib;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\atlmfc\lib;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\atlmfc\lib\i386;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK\lib;C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\lib;C:\Program Files (x86)\Microsoft Visual Studio 8\;C:\Program Files (x86)\Microsoft Visual Studio 8\lib
    520 : ENV _ACP_PATH=C:\Program Files (x86)\Microsoft Visual Studio 8\VC\bin;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\PlatformSDK\bin;C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools\bin;C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\tools;C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\ide;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\bin;C:\Windows\Microsoft.NET\Framework\v2.0.50727;C:\Program Files (x86)\Microsoft Visual Studio 8\;C:\Program Files (x86)\Microsoft Visual Studio 8\\SDK\v2.0\bin;C:\Windows\SysWow64;;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Microsoft Windows Performance Toolkit\
    520 : ENV PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Microsoft Windows Performance Toolkit\;C:\Program Files (x86)\Microsoft Visual Studio 8\;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\bin
    Ceci semble montrer que c'est bien l'environnement modifié qui est passé au processus créé (contrairement à ce que j'avais supposé)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/05/2006, 11h11
  2. Librairies dynamique sous AIX en C++ : MaLib.so
    Par didierM dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 23/10/2003, 18h19
  3. [BES] Création d'une variable d'environnement
    Par NGI80 dans le forum Autres
    Réponses: 2
    Dernier message: 17/10/2002, 07h31
  4. nom de fichier et variables d'environnement
    Par joebarthib dans le forum Langage
    Réponses: 2
    Dernier message: 18/07/2002, 15h21
  5. Réponses: 4
    Dernier message: 18/07/2002, 13h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo