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 :

Conversion variable string en TCHAR dans dll


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Par défaut Conversion variable string en TCHAR dans dll
    Bonjour,

    Ma présence sur ce forum est exceptionnelle car je développe mes projets en Delphi.

    Le dernier en date doit utiliser une dll codée en C++ pour générer un menu et un sous menu dans un logiciel de simulation de vol et à partir de ces menus lancer deux petites applications utilitaires à la principale.

    en voici le code récupéré sur un autre forum:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    // startDll.cpp*: définit les fonctions exportées pour l'application DLL.
    //
     
    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    #include <tchar.h>
    #include <Shlobj.h> 
    #include "SimConnect.h"
     
     
    static enum GROUP_ID {
    	GROUP_MENU
    };
     
    static enum EVENT_ID {
    	EVENT_MENU_START,
    // 	EVENT_MENU_TWO,
    };
     
    HANDLE  hSimConnect = NULL;
    static int quit = 0 ;
     
    void CALLBACK MyDispatchProcMI(SIMCONNECT_RECV* pData, DWORD cbData, void *pContext)
    {
    	HRESULT hr;
    	switch(pData->dwID)
    	{
    	case SIMCONNECT_RECV_ID_EVENT:
    		{
    			SIMCONNECT_RECV_EVENT *evt = (SIMCONNECT_RECV_EVENT*)pData;
     
    			switch(evt->uEventID)
    			{
    			case EVENT_MENU_START:
    				{
    					STARTUPINFO si = { 0 };
    					si.cb = sizeof(si);
    					si.dwFlags = STARTF_USESHOWWINDOW;
    					si.wShowWindow = SW_SHOWNORMAL  ;
     
    					PROCESS_INFORMATION pi = { 0 };
     
    					TCHAR szFolderPath[MAX_PATH];
    					hr = SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, 
    						szFolderPath);
     
    					//****** Insert here the path to the prog you want to exec **************
     
    					TCHAR pg[] =  L"\\Harperick\\Harperick v1\\client.exe\0" ;
     
    					// Concat path + program name
    					wcscat(szFolderPath, pg) ;
     
    					::CreateProcess(NULL, szFolderPath, NULL, NULL, FALSE, 
    						NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi) ;
     
    					break;
    				}
     
    			default:
    				break;
    			}
    			break;
    		}
     
    	case SIMCONNECT_RECV_ID_QUIT:
    		{
    			quit = 1;
    			break;
    		}
     
    	default:
    		printf("Received ID: %d", pData->dwID);
    		break;
    	}
    }
     
    int __stdcall DLLStart(void)
    {
    	HRESULT hr;
    	// Place all initialization code for the client in this function
    	if (SUCCEEDED(SimConnect_Open(&hSimConnect, "StartHarperick", NULL, 0, 0, 0)))
    	{
    		// Create some private events
    		hr = SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_MENU_START);
    // 		hr = SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_MENU_TWO);
     
    		hr = SimConnect_MenuAddItem(hSimConnect, "Start Harperick", EVENT_MENU_START, 12345);
     
    		// Sign up for the notifications
    		hr = SimConnect_AddClientEventToNotificationGroup(hSimConnect, GROUP_MENU, EVENT_MENU_START);
     
    		hr = SimConnect_SetNotificationGroupPriority(hSimConnect, GROUP_MENU, SIMCONNECT_GROUP_PRIORITY_HIGHEST);
    		SimConnect_CallDispatch(hSimConnect, MyDispatchProcMI, NULL);
    	}
    	return 0;
    }
     
    //
    // The DLLStop function must be present.
    //
    void __stdcall DLLStop(void)
    {
    	// Close the client
    	if (hSimConnect != NULL)
    		HRESULT hr = SimConnect_Close(hSimConnect);
    }
    Je souhaiterais pouvoir attribuer au TCHAR pg[], une variable string dont le contenu est collectée dans un fichier texte au lieu de d'une chaîne statique car chaque utilisateur peut avoir une chemin différent pour l'application en question.

    Absolument novice en C++ je souhaiterais avoir votre aide.

    Merci de ce que vous pourrez faire.

    Cordialement
    Pierre

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Je dirais que ça dépend de la version de Visual que tu utilises.

    Une version 2005 ou plus récente dispose de la classe CA2T dont le constructeur prend en paramètre un pointeur de char, et contient, une fois instanciée, une chaîne de TCHAR.
    Donc, ceci devrait fonctionner:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    string inputString;
     
    ...
     
    CA2T pg(inputString.c_str());
     
    // Concat path + program name
    _tcscat(szFolderPath, pg); //Note: wcscat() est pour des wchar_t, pas des TCHAR
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Par défaut
    Merci Médinoc pour cette réponse.

    Je vais tester cela et reviendrai rendre compte ici aussitôt.

    Bien cordialement
    Pierre

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Par défaut
    Bonjour Médinoc

    J'ai essayé la solution proposée, mais sans succès. Possédant Visual C++ 2010 Express, je n'ai pu installé la bibliothèque ATL.

    Je vais devoir chercher une autre voie pour résoudre ce soucis.

    Merci en tout cas pour le temps que tu as consacré à mon problème

    Codialement
    Pierre

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Sinon, de bètes fonctions de conversion:
    Code C : 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
    37
    38
    39
    /*TestConvertStr.h*/
    #pragma once
    #include <wchar.h>
     
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    wchar_t * AllocA2W(char const *sczA);
    char * AllocW2A(wchar_t const *sczW);
    char * AllocA2A(char const *sczA);
    wchar_t * AllocW2W(wchar_t const *sczW);
    void FreeA(char *szA);
    void FreeW(wchar_t *szW);
     
    char * AbortIfNullA(char *szA);
    wchar_t * AbortIfNullW(wchar_t *szW);
     
    #ifdef __cplusplus
    }
    #endif
     
    #ifdef _UNICODE
    	#define AllocA2T AllocA2W
    	#define AllocW2T AllocW2W
    	#define AllocT2T AllocW2W
    	#define AllocT2A AllocW2A
    	#define AllocT2W AllocW2W
    	#define FreeT FreeW
    	#define AbortIfNullT AbortIfNullW
    #else
    	#define AllocA2T AllocA2A
    	#define AllocW2T AllocW2A
    	#define AllocT2T AllocA2A
    	#define AllocT2A AllocA2A
    	#define AllocT2W AllocA2W
    	#define FreeT FreeA
    	#define AbortIfNullT AbortIfNullA
    #endif
    Code c : 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    /*TestConvertStr.c*/
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdlib.h>
    #include <string.h>
    #include <wchar.h>
    #include <stdio.h>
     
    #include "TestConvertStr.h"
     
    wchar_t * AllocA2W(char const *sczA)
    {
    	size_t const cchLenA = strlen(sczA);
    	size_t const cchLenW = mbstowcs(NULL, sczA, cchLenA+1);
    	wchar_t * szW = calloc(cchLenW+1, sizeof *szW);
    	if(szW!=NULL)
    		mbstowcs(szW, sczA, cchLenA+1);
    	return szW;
    }
    char * AllocW2A(wchar_t const *sczW)
    {
    	size_t const cchLenW = wcslen(sczW);
    	size_t const cchLenA = wcstombs(NULL, sczW, cchLenW+1);
    	char * szA = calloc(cchLenA+1, sizeof *szA);
    	if(szA!=NULL)
    		wcstombs(szA, sczW, cchLenW+1);
    	return szA;
    }
     
    char * AllocA2A(char const *sczA)
    {
    	size_t const cchLenA = strlen(sczA);
    	char * szA = calloc(cchLenA+1, sizeof *szA);
    	if(szA!=NULL)
    		strcpy(szA, sczA);
    	return szA;
    }
    wchar_t * AllocW2W(wchar_t const *sczW)
    {
    	size_t const cchLenW = wcslen(sczW);
    	wchar_t * szW = calloc(cchLenW+1, sizeof *szW);
    	if(szW!=NULL)
    		wcscpy(szW, sczW);
    	return szW;
    }
     
    void FreeA(char *szA)
    {
    	free(szA);
    }
    void FreeW(wchar_t *szW)
    {
    	free(szW);
    }
     
    char * AbortIfNullA(char *szA)
    {
    	if(szA==NULL)
    	{
    		fputs("Echec d'allocation en conversion de chaine!\n", stderr);
    		abort();
    	}
    	return szA;
    }
    wchar_t * AbortIfNullW(wchar_t *szW)
    {
    	if(szW==NULL)
    	{
    		fputs("Echec d'allocation en conversion de chaine!\n", stderr);
    		abort();
    	}
    	return szW;
    }
    C'est très "C" plutôt que C++, mais ça fait le boulot:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    string inputString;
     
    ...
     
    LPTSTR pg = AbortIfNullT(AllocA2T(inputString.c_str()));
     
    // Concat path + program name
    _tcscat(szFolderPath, pg); //Note: wcscat() est pour des wchar_t, pas des TCHAR
    FreeT(pg), pg=NULL;
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Par défaut
    Bonjour, Médinoc

    Je vais tester cette idée et reviendrai avec un compte rendu

    Merci beaucoup

    Cordialement

    Pierre

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Par défaut
    Bonjour,

    Je vous remercie vivement pour votre aide.
    J'ai trouvé un début de réponse ici dans ce forum spécialisé Flight Simulator:

    http://www.fsdeveloper.com/forum/sho...607#post643607

    Je vais donc suivre ce thread plus proche de ce que je sais faire (très peu) en C++.

    Encore merci pour votre temps et votre patience.

    Bien cordialement
    Pierre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conversion des String en int dans un tMap
    Par tarah01 dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 11/06/2013, 09h44
  2. conversion variable string en nombre à 3 DEC
    Par karim19 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 27/10/2009, 14h29
  3. Réponses: 5
    Dernier message: 20/02/2007, 06h27
  4. Condition contenu dans une variable string
    Par tomo0013 dans le forum Access
    Réponses: 6
    Dernier message: 01/12/2005, 14h15
  5. Réponses: 2
    Dernier message: 21/01/2004, 17h59

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