Envoyer variable à dll

goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008 - 29 oct. 2004 à 17:54
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008 - 30 oct. 2004 à 14:13
Salut,

Est il possible d'envoyer une variable à une dll ??

Par exemple dans mon programme j'ai la variable char fenetre[256].
Cette variable contient la chaine "internet explorer".

Comment faire pour que dans ma dll, ma fonction :
FindWindow(fenetre,NULL)
corresponde à :
FindWindow("internet explorer",NULL);

11 réponses

Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
29 oct. 2004 à 18:13
Bonne question, et désolé, mais aucune idée...et toi, tu a une idée pour repondre à ma question (quasi juste ne dessous de le tienne, qui porte aussi sur les dll) ?

Allez, a++

Genda67, à votre service !
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
29 oct. 2004 à 22:48
salut,
soit la fonction de ta DLL est appelé depuis ton programme, dans ce cas, tu fais simplement dans le code de ton programme lafonctiondetaDLL("internet explorer"), et dans ta DLL, t'as une fonction qui ressemble a :
void lafonctiondetaDLL(const char* val) {
FindWindow(val, NULL);
}
normalement il est toujours possible de se ramener a un tel cas, car si une fonction de DLL est appelé, c'est que quelque part dans un .exe une fonction de la DLL a été appelée explicitement, et donc le .exe peut lui transmettre ce qu'il veut...

sinon (ce qui revient a dire que ton programme est mal organisé)
ben tu peux toujours t'orienter du coté de CreateFileMapping, pour creer une zone mémoire partagé qui pourra etre accessible d'un peu partout.

enfin je pense que tu devrais détailler davantage ton probleme, sinon il est possible que tu te compliques la vie pour rien...
rappelons qu'une DLL n'est juste que le code compilé de fonctions (soit par ce que ce code peut servir dans d'autres applications (par exemple) ou bien parce que tu as voulu rendre ton programme modulaire). Si la DLL est lié statiquement a ton programme, quand tu codes ton exe, tu peux appeler toutes les fonctions de la DLL comme si elles se trouvaient ds un des fichiers .cpp de ton programme principal...
a++ ;)
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008
30 oct. 2004 à 00:31
Je fais comme ça :

Ma dll
#include <windows.h>

HINSTANCE thismod;
HINSTANCE hInstance;
HHOOK hhk;
HWND hDlg;
HWND Dlg;
const char* val;

BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID Reserved)
{
  if(dwReason == DLL_PROCESS_ATTACH) 
  thismod = hDll;

  return 1;
}

LRESULT CALLBACK kbdWinAmp(int nCode, WPARAM wParam, LPARAM lParam) 
{
  

if(nCode >= 0) 
  {
   //quand une fenetre est activé
  if(nCode == HCBT_ACTIVATE)  
  {
  if (hDlg = FindWindow(val,NULL))
  
  {			  
  if (Dlg=FindWindow(NULL,"Protection activée")) 			  
PostMessage(Dlg, WM_USER+1, 0, 0);	  
  }
  }
  
  }
 return CallNextHookEx(hhk, nCode, wParam, lParam);
}

extern "C" __declspec(dllexport) int __stdcall Intercepte(const char* val)
{
  if(!hhk) 
  hhk  = SetWindowsHookEx(WH_CBT, kbdWinAmp, thismod, 0);
  
  return (int) hhk;
}

extern "C" __declspec(dllexport) void __stdcall FinIntercepte()
{
  if(hhk) 
  {
  UnhookWindowsHookEx(hhk); 
  hhk = 0;
  }
}

Mon programme
Intercepte("Outlook Express Browser Class");


Header inclue dans mon programme mais pas dans la dll
#ifndef __DLL_LIBS_H__
#define __DLL_LIBS_H__

// include servant à inclure le fichier lib de la dll
#ifdef WIN32
#pragma comment(lib, "dll hook.lib")

extern "C" 
{
int __stdcall Intercepte(const char* val);
void __stdcall FinIntercepte();
}
#endif

#endif __DLL_LIBS_H__


Ca marche toujours pas ...
0
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 10
30 oct. 2004 à 01:11
ton programme tu dis faire: "Intercepte("Outlook Express Browser Class");" et voici la fonction de ta dll:
extern "C" __declspec(dllexport) int __stdcall Intercepte(const char* val)
{
if(!hhk) 
hhk = SetWindowsHookEx(WH_CBT, kbdWinAmp, thismod, 0);

return (int) hhk;
}

alors ta fonction reçoit "val", mais c'est tout, la "valeur" de val n'est pas traité, on en fait rien... et dans toute ta dll, val n'est pas utilisé !!! normal qu'il ne se passe rien !!! vu que "val" est une variable globale à la fonction de ta procédure, une fois sorti de ta procédure, val n'existe plus meme, si une variable globale porte le meme nom... d'ailleur le fait qu'une variable locale et globale porte le même nom, c'est pas génial ca...

essai de faire ca:
#include <windows.h>

HINSTANCE thismod;
HINSTANCE hInstance;
HHOOK hhk;
HWND hDlg;
HWND Dlg;
const char* g_val;

BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID Reserved)
{
if(dwReason == DLL_PROCESS_ATTACH) 
thismod = hDll;

return 1;
}

LRESULT CALLBACK kbdWinAmp(int nCode, WPARAM wParam, LPARAM lParam) 
{

if(nCode >= 0) 
{
//quand une fenetre est activé
if(nCode == HCBT_ACTIVATE) 
{
if (hDlg = FindWindow(g_val,NULL))

{ 
if (Dlg=FindWindow(NULL,"Protection activée")) 
PostMessage(Dlg, WM_USER+1, 0, 0); 
}
}

}
return CallNextHookEx(hhk, nCode, wParam, lParam);
}

extern "C" __declspec(dllexport) int __stdcall Intercepte(const char* val)
{
if(!hhk) 
{
hhk = SetWindowsHookEx(WH_CBT, kbdWinAmp, thismod, 0);
g_val = val;
}

return (int) hhk;
}

extern "C" __declspec(dllexport) void __stdcall FinIntercepte()
{
if(hhk) 
{
UnhookWindowsHookEx(hhk); 
hhk = 0;
}
}

Bob...

"La chance accorde ses faveur aux esprits avertis..."
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008
30 oct. 2004 à 01:36
Ca marche toujours pas ...

En fait cette partie :

extern "C" __declspec(dllexport) int __stdcall Intercepte(const char* val)
{
if(!hhk) 
{
hhk = SetWindowsHookEx(WH_CBT, kbdWinAmp, thismod, 0);
g_val = val;
}


est traitée dans mon programme est non dans la dll.

Donc comment le g_val peut il est ensuite connu dans la dll ???
Faut mettre un header ?
0
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 10
30 oct. 2004 à 01:48
je comprend pas pourquoi une partie de ta dll est traité dans ton prog... ce que tu dis qui est traité dans ton prog, fais en sorte que ca soit traité dans ta dll!!! mais garde le meme schéma que moi... que ce que tu avais fait avant, c'est transmettre une valeur à "val", mais cette valeur est perdu, puisque non traité !!!
Bob...

"La chance accorde ses faveur aux esprits avertis..."
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
30 oct. 2004 à 01:49
salut;
qd tu déclenches le hook, tu lances la fonction Intercepte si j'ai compris. cette fonction ainsi que le reste de la DLL est mappé (cad est injecté ds l'espace memoire) ds le processus hooké, mais comme tu l'as mise en extern, elle peut etre apelé depuis ton exe principal. le g_val doit etre une variable globale de la DLL, et elle est modifiée par le Intercept au moment du lancement du hook. c pour ca que je suis pas sur que g_val = val marche ds le intercepte, par contre si tu déclares g_val comme char g_val[100]; et que ds intercepte, tu copies ce que vaux val ds g_val, la ya plus de chances que ca marche (sinon g_val pointe vers une adresse qui a des chances de ne pas etre valide au sein du processus hooké)

a++ ;)
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008
30 oct. 2004 à 11:41
J'ai fait des tests pour voir les valeurs de val et g_val à différents endroits.

LRESULT CALLBACK kbdWinAmp(int nCode, WPARAM wParam, LPARAM lParam) 

{	if(debut==1)
{
FILE *fd;
fd = fopen("save3.txt","a");
fprintf(fd,"%s\n%s",val,g_val);
fclose(fd);
debut=0;
}

if(nCode >= 0) 
  {


Val => Outlook Express Browser Class
g_val => Outlook Express Browser Class

if(nCode >= 0) 
  {
   //quand une fenetre est activé
  if(nCode == HCBT_ACTIVATE)  
  {		  
 if(debut==1)
{
FILE *fd;
fd = fopen("save3.txt","a");
fprintf(fd,"test\n%s\n%s",val,g_val);
fclose(fd);
debut=0;
}
  if (hDlg = FindWindow(g_val,NULL))
  
  {			  
  if (Dlg=FindWindow(NULL,"Protection activée"))

  {

PostMessage(Dlg, WM_USER+1, 0, 0);

  }
  }
  }
  
  }


Val => rien(du blanc..)
g_val=> rien

Je comprends pas pourquoi d'un coup, val et g_val ne valent plus rien ...?
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008
30 oct. 2004 à 12:05
Excusez moi j'ai raconté n'importe quoi au message précédent ...

En fait ici :

//quand une fenetre est activé
  if(nCode == HCBT_ACTIVATE)  
  {
if(debut==2)
{
FILE *f;
f = fopen("save4.txt","a");
fprintf(f,"2nd valeurs :\n%s\n%s",val,g_val);
fclose(f);
debut=0;
}
  if (hDlg = FindWindow(g_val,NULL))

g_val vaut bien: Outlook Express Browser Class.
Mais par contre ça me trouve toujours pas la fenêtre ...

Aidez moi SVP, je suis presque au bout là ...
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
30 oct. 2004 à 13:48
ha ben c'est dja un autre probleme mtnt, t'es sur que seul le FindWindow te pose probleme et ne trouve pas ce que tu veux?

a++ ;)
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008
30 oct. 2004 à 14:13
En fait c'est bon ça marche !!!
Mais y a encore un petit problème ....

Si je met :
if (hDlg = FindWindow("Outlook Express Browser Class",NULL))

Dès que Outlook s'ouvre ça met met un message.

Mais si je met :
if (hDlg = FindWindow(g_val,NULL))

Quand Outlook s'ouvre ça me me rien , mais SI je CLIQUE sur mon programme(qui est derrière la fenêtre Outlook) ça me met le message !!!...
0