begin process at 2012 05 29 13:44:53
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

API

 > 

Pointeur de fonction : multi-appels


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Pointeur de fonction : multi-appels

samedi 22 janvier 2005 à 16:58:44 | Pointeur de fonction : multi-appels

Gendal67

Bonjour tout le monde,

Les pointeurs de fonction me posent problême!! sniff!! En fait, j'ai un pointeur de fonction pointant sur une fonction se trouvant dans une DLL! Ce pointeur fonctionne!! J'arrive à appeller la fonction...le soucis, c'est que lorsqu'avec le même pointeur j'essaie de lancer la même fonction, la fonction n'est pas executée!! Que faire dans un tel cas ??

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
samedi 22 janvier 2005 à 22:21:57 | Re : Pointeur de fonction : multi-appels

dletozeun

tu veux dire que la premiere fois ca marche mais la deuxieme fois que t'appelle la fonction ca marche pas?
samedi 22 janvier 2005 à 23:19:53 | Re : Pointeur de fonction : multi-appels

Gendal67

Oui c'est exactement ça!! Et c'est pas la première fois que ça me le fait en fait...:s

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
dimanche 23 janvier 2005 à 01:31:32 | Re : Pointeur de fonction : multi-appels

racpp

Administrateur CodeS-SourceS
Salut, Tu n'as pas oublié la convention d'appel de la fonction? Si oui, voici un exemple d'utilisation d'un pointeur de fonction avec convention d'appel WINAPI: typedef BOOL (WINAPI *PFonction) ( int, char); PFonction MaFonction; MaFonction=(PFonction)GetProcAddress(hDLL,"fonction"); Par défaut le compilateur (comme visual c) ajoute la convention "__cdecl" qui pourrait causer des plantages ou anomalies si la fonction utilise une autre convention (WINAPI = __stdcall). En général, les DLLs utilisent WINAPI. Il est possible que ton problème viendrait de là.
dimanche 23 janvier 2005 à 10:59:04 | Re : Pointeur de fonction : multi-appels

Gendal67

Eh bien c'est fort probable en effet, mais j'ai essayé avec WINAPI et cela ne donne rien de +...la fonction est URLDownloadToFile() .... il semble sur msdn qu'elle n'est pas d'étiquette (WINAPI, CALLBACK, etc...) précise....une idée ??

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
dimanche 23 janvier 2005 à 11:01:19 | Re : Pointeur de fonction : multi-appels

Gendal67

#define LPBINDSTATUSCALLBACK DLGPROC
#define MAX_DOWNLOAD_PAGES 50

typedef HRESULT (WINAPI *DOWNLOAD) (LPUNKNOWN, LPCTSTR, LPCTSTR, DWORD, LPBINDSTATUSCALLBACK);
DOWNLOAD pDown;

// instructions

bool Initialize() {
 
  hDll = LoadLibrary("urlmon.dll");
 
  if(!hDll) return false;
 
  pDown = (DOWNLOAD) GetProcAddress(hDll, "URLDownloadToFileA");
  
  if(!pDown) return false;

  //instructions...
}

Si cela peut t'aider....


Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))

dimanche 23 janvier 2005 à 19:03:39 | Re : Pointeur de fonction : multi-appels

racpp

Administrateur CodeS-SourceS
Salut, L'erreur est certainement ailleurs dans ton code. Toutes les fonctions des DLLs de Windows sont en WINAPI. Voici un petit exemple permettant de télécharger 3 pages l'une après l'autre de 3 sites différents: typedef HRESULT (WINAPI *DOWNLOAD) (LPUNKNOWN, LPCTSTR, LPCTSTR, DWORD, LPBINDSTATUSCALLBACK); HINSTANCE hDll = LoadLibrary("urlmon.dll"); DOWNLOAD pDown= (DOWNLOAD) GetProcAddress(hDll, "URLDownloadToFileA"); CoInitialize(0); HRESULT err=pDown(0,"http://www.google.fr/index.html","c:\\google.txt",0,0); err=pDown(0,"http://www.voila.fr/index.html","c:\\voila.txt",0,0); err=pDown(0,"http://www.yahoo.fr/index.html","c:\\yahoo.txt",0,0); CoUninitialize(); FreeLibrary(hDll); Je viens de le tester, et ça marche parfaitement. Petite remarque: si tu veux intercepter les événements de progression ou de la fin du téléchargement (etc...), le dernier paramètre de "URLDownloadToFileA" doit être un pointeur sur une interface "IBindStatusCallback" définie dans ton programme sous forme de classe. Si ça t'intéresse, je posterai ici un exemple de cette petite classe.
dimanche 23 janvier 2005 à 19:37:53 | Re : Pointeur de fonction : multi-appels

Gendal67

Non pour le truc de la classe....mais ça me tue que chez moi cela ne marche pas (jamais d'ailleurs)!! Jte montre mon code, pourrais tu y trouver l'erreur ? :

#include <windows.h>
#include <stdio.h>

#define LPBINDSTATUSCALLBACK DLGPROC
#define MAX_DOWNLOAD_PAGES 50

typedef HRESULT (WINAPI *DOWNLOAD) (LPUNKNOWN, LPCTSTR, LPCTSTR, DWORD, LPBINDSTATUSCALLBACK);

DOWNLOAD pDown;

char szPath[MAX_PATH];
HINSTANCE hDll;

bool Initialize();

DWORD WINAPI ScanWeb(LPVOID pv) {
 
  static int nbThread = 0;
 
  if(nbThread > MAX_DOWNLOAD_PAGES) return 0L;
 
  nbThread++;
 
  char szURL[MAX_PATH];
  lstrcpy(szURL, (char*) pv);
 
  char szFile[MAX_PATH];
  GetName(szFile);
 
  pDown(0, szURL, szFile, 0, 0);
    
  nbThread--;
  return 0L;   
 }
 
bool Initialize() {
 
  hDll = LoadLibrary("urlmon.dll");
 
  if(!hDll) return false;
 
  pDown = (DOWNLOAD) GetProcAddress(hDll, "URLDownloadToFileA");
  
  if(!pDown) return false;
  
  return true;
 }

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))

lundi 24 janvier 2005 à 02:12:53 | Re : Pointeur de fonction : multi-appels

racpp

Administrateur CodeS-SourceS
Je pense que tu n'as pas bien vu les deux fonctions CoInitialize() et CoUninitialize() dans mon exemple. Désolé pour la présentation que je n'arrive plus à soigner dans cette nouvelle version du forum. Comment tu fais toi? La fonction URLDownloadToFile() est cencée fonctionner avec les Activex et les interfaces. C'est pour cela qu'il est obligatoire d'initialiser la librairie COM avec CoInitialize() avant de l'utiliser. Voici un exemple avec ton code comme noyau. Et ça marche aussi: [code] #include #include #define LPBINDSTATUSCALLBACK DLGPROC #define MAX_DOWNLOAD_PAGES 50 typedef HRESULT (WINAPI *DOWNLOAD) (LPUNKNOWN, LPCTSTR, LPCTSTR, DWORD, LPBINDSTATUSCALLBACK); DOWNLOAD pDown; char szPath[MAX_PATH]; HINSTANCE hDll; void GetName(char *File) { static int compt=0; if (compt==0) strcpy(File,"c:\\google.txt"); if (compt==1) strcpy(File,"c:\\voila.txt"); if (compt==2) strcpy(File,"c:\\yahoo.txt"); compt++; return; } DWORD WINAPI ScanWeb(LPVOID pv) { static int nbThread = 0; if(nbThread > MAX_DOWNLOAD_PAGES) return 0L; nbThread++; char szURL[MAX_PATH]; lstrcpy(szURL, (char*) pv); char szFile[MAX_PATH]; GetName(szFile); pDown(0, szURL, szFile, 0, 0); nbThread--; return 0L; } bool Initialize() { hDll = LoadLibrary("urlmon.dll"); if(!hDll) return false; pDown = (DOWNLOAD) GetProcAddress(hDll, "URLDownloadToFileA"); if(!pDown) return false; return true; } int main() { CoInitialize(0); bool ret=Initialize(); char url[MAX_PATH]; strcpy(url,"http://www.google.com/index.html"); ScanWeb((LPVOID)url); strcpy(url,"http://www.voila.fr/index.html"); ScanWeb((LPVOID)url); strcpy(url,"http://www.yahoo.fr/index.html"); ScanWeb((LPVOID)url); FreeLibrary(hDll); CoUninitialize(); return 0; } [/code] J'espère que cette fois la présentation sera meilleure.
lundi 24 janvier 2005 à 02:21:28 | Re : Pointeur de fonction : multi-appels

racpp

Administrateur CodeS-SourceS
Franchement cette nouvelle version du forum ne me plait pas du tout. Même le bouton "Ajouter" refuse souvent de répondre. J'espère que ce sera réglé très bientôt.

1 2

Cette discussion est classée dans : fonction, multi, pointeur, appels


Répondre à ce message

Sujets en rapport avec ce message

Problème de pointeur [ par sebastienbro ] Bonjour,G une fonction ki a comme argument un pointeur vers un struct personnalisé.J'aimerais savoir commen je peu faire pour modifier lé éléments de gestion multi utlisateur [ par marelo87 ] bonjour,j ai deux question:- j aimerais savoir comment faire "attendre" une fonction. dans un programme le serveur doi recevoir desdonnées taper par l Pointeur sur fonction envoyé par dll [ par MoDDiB ] Voila ce que j'ai fais mais ca ne marche pas :Dll :#include BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){ retu Une fonction multi-type ? [ par TeLeTUbIz ] Ouah !!!J'ai cherché, scruté dans tout les coins, soulevé les montagnes,... mais je ne trouve pas solution à mon problème.En fait, je voudrais faire u question sur les pointeur et tableau et matrice [ par Battousai ] bonjour a tous,ma question se porte comme indiqué si dessus sur l'utilisation des pointeur avec les tableau et surtout les matrices ou plus.d'abord j' Pointeur vers une fonction dans une classe ... [ par MoDDiB ] Supposons que j'ai la fonctionvoid Fonction(int test,int t);appartenant a la classe Cclass.Quelle est la syntaxe pour creer un pointeur vers cette fon pb pointeurs [ par Arnaud16022 ] bonsoirj'ai un peu de mal avec les pointeurs et ma fonction marche pas trop.Le but est de passer une variable en parametre a une fonction, qui va stoc pointeur static sur fonction :) [ par luhtor ] Certain reconnaitront surement le tutoriel en question. J'ai rajouté quelques trucs au gestionnaire d'exception, mais je bloque sur le point suivant:J pointeur et handle [ par yerosnimus ] Bonjour, bon, je suis débutant et surtout autodidacte en programmation. J'essaie de comprendre actuellement l'utilisation d'un pointeur avec une fonc Langage C: Problème de retour de Pointeur dans une fonction [ par loic911 ] SalutJ'aimerais bien renvoyer l'endroit d'un pointeur sur un tableau a deux dimension à une autre fonction exemple:


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,420 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales