[Résolu] envoi de fax en C

hajer
[Résolu] envoi de fax en C

bonjour

j'aimerai utiliser les api windows pour programmer une application qui envoie des faxs en C. Le problème c'est qu'en consultant la MSND de windows j'ai trouvé que l'api qui concerne l'envoi de fax n'est utilisable qu'en c++.

Avez vous une idée si on peut tout de même le faire en C.
merci d'avance :)

fredericmazue

Quote:
j'aimerai utiliser les api windows pour programmer une application qui envoie des faxs en C.

Finalement tu as fait ton choix à ce que je vois.
Quote:
Le problème c'est qu'en consultant la MSND de windows j'ai trouvé que l'api qui concerne l'envoi de fax n'est utilisable qu'en c++.

D'où sort ce canular ?
Voici ce que dit la MSDN:

"The following steps summarize typical programming tasks required to incorporate the functionality of the Fax Service Client API in a C/C++ fax client application if you are using the Component Object Model (COM) implementation. "

Donc en C OU C++. Les API sont des interfaces COM (au sens Component Object Model, rien à voir ave cle port série hein ?) et le sinterfaces COM ça se manipule très bien C. A l'origine COM a même été fait pour C. Sinon en dehors des interfaces COM les API pures (les fonctions je veux dire comme par exemple FaxOpenPort) sont en C et il n'y a donc aucun problème à les appeler avec C.

hajer

Quote:
Finalement tu as fait ton choix à ce que je vois.

eh oui! finalement je me suis rendue compte que j'allais me jeter dans quelque chose de très flou, et je ne saurai dire si je pouvais m'en sortir avec quelque chose de concret ou pas. Merci pour m'avoir donné l'idée en tout cas.
Juste une question, pensez vous que ce sera possible, si je suis vos conseils, qu'en faisant le lien entre C et JAVA à l'aide de JNI pour envoyer un fax, j'utilise tout ce mélange dans une application web à l'aide de jsp :shock: , parce qu'en fait l'application que je vais développer sera orientée web et implémentée sur un réseau local :D
Si ca c'est faisable... :twisted: mon projet est dans la poche.
dites moi que ouiii :?
fredericmazue

Quote:
eh oui! finalement je me suis rendue compte que j'allais me jeter dans quelque chose de très flou, et je ne saurai dire si je pouvais m'en sortir avec quelque chose de concret ou pas. Merci pour m'avoir donné l'idée en tout cas.

Très flou. Tu parles....
Pour envoyer un fax tu as 4 ou 5 fonctions à appeler depuis C. Il n'y a vraiment pas de quoi casser trois pattes à un canard ni rien de flou. Pour les fonctions, je dirais, de tête:
FaxEnumPorts, FaxOpenPort, FaxSendDocument, FaxClose.
Qu'est-ce qui est flou ou difficile là ? (bon il doit bien y avoir 2 ou 3 fonctions à utiliser en plus, je ne me souviens pas parfaitement, mais ça ne change rien sur le fond)

Quote:
dites moi que ouiii

ouiiiii
Bien sûr que ouiiiiii :lol:
A une seule condition. Il faut que tu ais le droit de relancer la JVM du serveur avec l'option -D ava.library.path, OU que tu ais le droit de modifier le PATH sur la machine qui fait tourner le serveur.
L'un ou l'autre sont nécessaires pour que la JVM puisse charger cette fameuse petite librairie C que tu auras écrite.
C'est l'administrateur (humain) de la machine qui te donnes ce droit ou pas. A voir avec lui donc.
hajer

Quote:

Très flou. Tu parles....
Pour envoyer un fax tu as 4 ou 5 fonctions à appeler depuis C. Il n'y a vraiment pas de quoi casser trois pattes à un canard ni rien de flou.

Nonn, vous m'aviez pas comprise!! Je désignais par flou la programmation du port série, pas celle avec les api windows, c'est pour ca que je vous ai remercié de m'avoir donné l'idée, sinon j'aurai abandonné sans rien entre les mains!!

Quote:
C'est l'administrateur (humain) de la machine qui te donnes ce droit ou pas. A voir avec lui donc.

Non non pour ça peu importe, parce que ma prof, je vais lui faire la démo à la fac, avec les moyens du bord, mais pas dans la société qui m'a donné l'idée du projet. Donc ca ira pour la JVM.

Merci en tout cas, que ferai je sans vous!!
en tout cas je ferai par du résultat de mon travail dès que j'aurai fini... dans quelques semaines :roll:

hajer

ah! j'ai une autre question :roll: , toujours moi et mes questions. Pour les besoins de mon application, je dois automatiser la tâche d'envoi de fax (et de mail) de façon à ce que l'opération se dérouler en arrière plan par rapport à l'interface homme machine. en d'autres termes, pour concrétiser cette tâche je dois jouer sur des threads qui vont accomplir l'envoi voulu sans intervention d'un utilisateur de l'application. Biensur, celui - ci pourra controler le rapport des relances effectuées en consultant la base de donnée de l'application qui constitue le moyen de communication de l'utilisateur avec les threads.
Si je détaille un peu mon raisonnement, ce sera a la machine serveur d'effectue l'envoi de fax et de mail, pas la machine cliente, enfin c'est ce que j'imagine, je peux me tromper...
Je pense que ce détail est assez louche, enfin je ne sais pas s'il est réalisable. A priori, il doit l'être si jappuie mon idée avec l'exemple d'envoi de mailing list qui, a mon avis est automatique et n'exige pas l'intervention d'un administrateur...

a bientot

fredericmazue

Quote:
sans intervention d'un utilisateur de l'application. Biensur, celui - ci pourra controler le rapport des relances effectuées en consultant la base de donnée de l'application qui constitue le moyen de communication de l'utilisateur avec les threads.
Si je détaille un peu mon raisonnement, ce sera a la machine serveur d'effectue l'envoi de fax et de mail, pas la machine cliente, enfin c'est ce que j'imagine, je peux me tromper...

Ben oui....
hajer

et pouvez vous me dire où se trouve le fameux "fax service sdk for c/c++" :D

je le trouve pas !!!! :evil: :evil:

fredericmazue

Quote:
pouvez vous me dire où se trouve le fameux "fax service sdk for c/c++"

Je ne pense pas avoir parlé quelque part de "fax service SDK" moi... :evil:
Lis donc ma réponse à ton autre question dans le forum de programmation Windows. Tu auras ce qu'il te faut.
hajer

voilà je suis à mes premiers essais d'envoi de fax... ou plutôt à mes premiers échecs :lol:
selon la msdn concernant l'envoi de fax, voici la fonction à utiliser pour se connecter au serveur local de fax (celui de windows à mon avis)

Syntax
BOOL WINAPI FaxConnectFaxServer(LPCTSTR MachineName,LPHANDLE FaxHandle);
Parameters
MachineName
[in] This pointer must be NULL (an empty string), so that the application connects to the fax server on the local computer.
FaxHandle
[out] Pointer to a variable that receives a fax server handle that is required on subsequent calls to other fax client functions. If the fax server returns a null handle, it indicates an error.
Return Value
If the function succeeds, the return value is nonzero.

j'ai biensur télécharger la psdk de windows, je l'ai installé et ajouté le path de "bin", "include" et "lib" à visual C/C++ v6, comme indiqué dans le help de la msdn.

donc enfin de compte, j'ai fait mon premier essai voici le code source :
c'est juste la fonction de connexion au serveur, juste pour essai, rien de plus

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

void main(){
	LPHANDLE hFax=NULL;
	printf("haloooo");
	if (!FaxConnectFaxServer(NULL,hFax))
        {
            printf( "no no");            
        }	
}

quand je compile ça m'affiche 0 erreurs mais quand j'exécute, c un message moins sympas et plutot incompréhensible !!

--------------------Configuration: Fax - Win32 Debug--------------------
Linking...
Fax.obj : error LNK2001: unresolved external symbol __imp__FaxConnectFaxServerA@8
Debug/Fax.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

Fax.exe - 2 error(s), 0 warning(s)

pour l'instant, je cherche encore mais je n'ai pas trouvé le problème...
pleeeaaase help!!!

fredericmazue

Quote:
e l'ai installé et ajouté le path de "bin", "include" et "lib" à visual C/C++ v6, comme indiqué dans le help de la msdn

Très bien, mais ça ne suffit pas.

Quote:
Linking...
Fax.obj : error LNK2001: unresolved external symbol __imp__FaxConnectFaxServerA@8
Debug/Fax.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

C'est parfatiement clair. Suffit de lire.
L'éditeur de lien te dit qu'il n'a pas pu trouver la fonction FaxConnectServer. Tout simplement parce que tu n'as pas fait l'édition de liens avec la librairie winfax.lib. Ajouter le répertoire lib comme tu dis, c'est indispensable, mais ça ne provoque pas pour autant une éditions de liens automatique. Tu peux consulter la doc de ton Visual sur ce sujet (Au fait passe donc à Visual Studio 2005 Express ou même 2008, c'est beaucoup moins cher et infiniment meilleur comme outil.)
Pour un petit essai comme le tien et sous Visual, une directive pragma est très bien pour faire l'édition de liens. Regarde dans le code ci dessous. C'est le tien que je n'ai pas pu m'empêcher de ré-écrire. :twisted:. Tu dois faire trop de Java toi, et tu manques de pratique d'un langage de programamtion. :twisted: Regarde: tu ouvres une ressource et tu la fermes pas :twisted:
Et puis void main c'est illégal en C ou C++ depuis belle lurette :twisted: Depuis la norme C 99. Et en C quand une fonction ne prend pas d'argument il est recommandé d'écrire void.

donc int main() <<-- en C++

et int main(void) <<-- en C

donc:

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

#pragma comment(lib, "winfax.lib")

// *jamais* de void main :twisted:
int main(void){
   HANDLE hFax=NULL;
   printf("haloooo");
   if (!FaxConnectFaxServer(NULL, &hFax))
        {
            printf( "no no");
           return 1;
        }  
   FaxClose(hFax);
  return 0; 
}
hajer

franchement frederic, je ne sais pas comment vous remercier pour votre aide!!!:D

nice day :wink:

hajer

et mon second échec (espérons que ce soit le dernier... :x )
voila donc j'ai à priori mis toutes les fonctions nécessaires pour un simple envoi de fax.

voici le code

#include <stdio.h> 
#include <windows.h> 
#include <winfax.h> 
#include <winbase.h>
#include <stdlib.h>

#pragma comment(lib, "winfax.lib") 
#pragma comment(lib, "kernel32.lib")

int main(){ 	
	PFAX_JOB_PARAM JobParams=NULL;
	HANDLE hFax=NULL;
	LPDWORD FaxJobId=NULL;	
	JobParams->SizeOfStruct=sizeof(FAX_JOB_PARAM);
	JobParams->RecipientNumber="22222222222";//juste un essai
	JobParams->RecipientName="mon binome";
	JobParams->Tsid=NULL;
	JobParams->SenderName="moi";
	JobParams->SenderCompany="INSAT";//ma fac
	JobParams->SenderDept=NULL;
	JobParams->BillingCode=NULL;
	JobParams->DeliveryReportType=DRT_NONE;
	JobParams->DeliveryReportAddress=NULL;
	JobParams->DocumentName="first step";
	JobParams->CallHandle=NULL;
	JobParams->Reserved[3]=0;
	printf("\nhaloooo"); 
	if (!FaxConnectFaxServer(NULL, &hFax)){ 
		printf( "\no no, non connecté"); 
		return 1;
	}  
	else printf("\nconnected to the local fax server");
	FaxCompleteJobParams(&JobParams,NULL);
	if (!FaxSendDocumentA(hFax,"c:\test_fax1.txt",JobParams,NULL,FaxJobId)){
		printf("\no no, not sent , %ld \n",GetLastError());
		return 1;
	}
	else printf("\nc bonnn pour l'envoi coooll!!!");
	printf("finiiiii!!!");
	FaxClose(hFax); 
	return 0; 
}

et voici ce qui s'affiche lors de la comilation :
:shock: :shock: :shock:

------ Build started: Project: Fax, Configuration: Debug Win32 ------
Compiling...
Fax.c
c:\program files\microsoft platform sdk for windows xp sp2\include\specstrings.h(334) : warning C4005: '__reserved' : macro redefinition
        c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1956) : see previous definition of '__reserved'
c:\program files\microsoft platform sdk for windows xp sp2\include\specstrings.h(341) : warning C4005: '__checkReturn' : macro redefinition
        c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1957) : see previous definition of '__checkReturn'
c:\program files\microsoft platform sdk for windows xp sp2\include\specstrings.h(344) : warning C4005: '__typefix' : macro redefinition
        c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1958) : see previous definition of '__typefix'
c:\program files\microsoft platform sdk for windows xp sp2\include\specstrings.h(349) : warning C4005: '__override' : macro redefinition
        c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1959) : see previous definition of '__override'
c:\program files\microsoft platform sdk for windows xp sp2\include\specstrings.h(350) : warning C4005: '__fallthrough' : macro redefinition
        c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1968) : see previous definition of '__fallthrough'
c:\program files\microsoft platform sdk for windows xp sp2\include\specstrings.h(351) : warning C4005: '__callback' : macro redefinition
        c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1960) : see previous definition of '__callback'
c:\program files\microsoft platform sdk for windows xp sp2\include\specstrings.h(352) : warning C4005: '__in' : macro redefinition
        c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1753) : see previous definition of '__in'
c:\program files\microsoft platform sdk for windows xp sp2\include\specstrings.h(353) : warning C4005: '__out' : macro redefinition
        c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1762) : see previous definition of '__out'
c:\program files\microsoft platform sdk for windows xp sp2\include\specstrings.h(354) : warning C4005: '__inout' : macro redefinition
        c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1781) : see previous definition of '__inout'
c:\program files\microsoft platform sdk for windows xp sp2\include\specstrings.h(356) : warning C4005: '__out_ecount' : macro redefinition
        c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1763) : see previous definition of '__out_ecount'
c:\program files\microsoft platform sdk for windows xp sp2\include\specstrings.h(357) : warning C4005: '__in_ecount' : macro redefinition
        c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1754) : see previous definition of '__in_ecount'
c:\program files\microsoft platform sdk for windows xp sp2\include\specstrings.h(358) : warning C4005: '__inout_ecount' : macro redefinition
        c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1782) : see previous definition of '__inout_ecount'
c:\program files\microsoft platform sdk for windows xp sp2\include\specstrings.h(359) : warning C4005: '__out_bcount' : macro redefinition
        c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1764) : see previous definition of '__out_bcount'
c:\program files\microsoft platform sdk for windows xp sp2\include\specstrings.h(360) : warning C4005: '__in_bcount' : macro redefinition
        c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1755) : see previous definition of '__in_bcount'
c:\program files\microsoft platform sdk for windows xp sp2\include\specstrings.h(361) : warning C4005: '__inout_bcount' : macro redefinition
        c:\program files\microsoft visual studio 9.0\vc\include\sal.h(1783) : see previous definition of '__inout_bcount'
c:\documents and settings\jo\mes documents\insat-gl3\mini_projet\faxing_windows_api\fax.c(25) : warning C4047: '=' : 'HCALL' differs in levels of indirection from 'void *'
Build log was saved at "file://C:\Documents and Settings\jo\Mes documents\INSAT-GL3\mini_projet\faxing_windows_api\Debug\BuildLog.htm"
Fax - 0 error(s), 16 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

:shock: :shock: :shock: :shock: :shock:

le problème avec ces warning c'est que ca concerne les fichiers include fournis par la sdk, donc c'est pas ma faute s'il ya des redéfinitions (je peux pas y toucher...)
et pour ce warning (je pense que le problème vient de lui) "warning C4047: '=' : 'HCALL' differs in levels of indirection from 'void *' "
j'ai rien compris, je ne sais meme pas quelle genre de variables va contenir HCALL, et le pire dans tout ça, c'est que dans la MSDN, voici ce qu'on dit de la variable CallHandle de type HCALL : "CallHandle : Reserved, and should be NULL."
C'est ce que j'ai mis, mais selon ce warning, ce n'est pas la bonne valeur à mettre ici!!

sinon quand j'exécute, je reçoit la fameuse fenêtre d'erreur de windows " Fax.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru."

est - ce qu'il manquerait une fonction??

fredericmazue

Houlà là, beaucoup de choses à dire.

1) déjà quand on change quelque chose par rapport à ce qu'on faisait avant, on le dit, pour ne pas enduire d'erreurs ceux qui essaient de t'aider sur un forum. Donc là tu as changé de compilateur car je vois "microsoft visual studio 9.0" Ca c'est Visual Studio 2008. Je ne sais pas quelle version tu as installée du 2008 mais soit:

- il vient avec sa propre SDK, et ta SDK XP et elle se télescopent

- il veut la SDK Vista seulement pour être heureux

Bref normalement tu dois utiliser une SDK du niveau du compilateur, c'est à dire Vista pour 2008. Non non ça ne pose pas de problème pour les API Fax. Si tu lis la MSDN tu verras qu'il faut un Windows 2000 minimum ce qui est ton cas.

Ou alors tu installes un Visual 2005 sur ta machine et tu travailles avec. Tu peux garder le 2008, car les Visual Studio cohabitent sans problème.

Bref si tu fais ça, tout tes warnings sauf un doivent disparaître. Si j'étais toi j'installerais un 2005 car c'est la solution la plus simple et directe pour toi.

2) reste donc comme avertissement:

'HCALL' differs in levels of indirection from 'void *

HCALL est un type opaque. Ca veut dire qu'on ne sait pas ce que c'est et qu'on a pas à le savoir. L'avertissement est normal en C. Tu ne l'aurais pas en C++. D'ailleurs tu aurais bien meilleur compte à écrire ton code en C++, par e que au niveau où tu l'utilises, il n'y a pas beaucoup de différence avec C, MAIS c'est plus agréable de traiter avec la JNI de Java en C++ qu'en C et finalement c'est là que tu veux en arriver. Bon tu vas me dire que tu connais et pas C++, mais moi je vais te répondre que tu ne connais ni l'un nu l'autre alors autant choisir le mieux :)

Bref la MSDN dit de mettre NULL alors tu mets NULL :twisted:

3) En C, c'est int main(void) C'est toujours agaçant d'essayer d'aider sur un forum et de voir que les conseils ne sont pas suivis :(

4)

Quote:
(je pense que le problème vient de lui) "warning C4047: '=' : 'HCALL' differs in levels of indirection from 'void *' "

Non le problème vient de toi. Et ton programme plante bien avant d'arriver là où tu crois. Il plante là:

JobParams->SizeOfStruct=sizeof(FAX_JOB_PARAM); <<-- BANG!!

Parce que tu déclares avant:

PFAX_JOB_PARAM JobParams=NULL;

MAIS PFAX_JOB_PARAM ça déclare un pointeur et non une strucutre FAX_JOB_PARAM comme tu le crois. C'est même pour ça qu'il y a un P dans le nom. P comme Pointeur. Tu as bien lu la MSDN pourtant:

typedef struct _FAX_JOB_PARAM {
    DWORD SizeOfStruct;
    LPCTSTR RecipientNumber;
    LPCTSTR RecipientName;
    LPCTSTR Tsid;
    LPCTSTR SenderName;
    LPCTSTR SenderCompany;
    LPCTSTR SenderDept;
    LPCTSTR BillingCode;
    DWORD ScheduleAction;
    SYSTEMTIME ScheduleTime;
    DWORD DeliveryReportType;
    LPCTSTR DeliveryReportAddress;
    LPCTSTR DocumentName;
    HCALL CallHandle;
    DWORD_PTR Reserved[3];
} FAX_JOB_PARAM, *PFAX_JOB_PARAM;

La petite étoile * ça veut dire POINTEUR;

Bref tu déclares un pointeur NULL et après tu affectes dedans alors évidemment.... C'est un peu comme si tu avais une NullPointerException en Java. Tu dois écrire:

FAX_JOB_PARAM JobParams;

et après

if (!FaxSendDocumentA(hFax,"c:\test_fax1.txt",&JobParams,NULL,FaxJobId)){ 

Remarque bien le & pour passer l'adresse de la structure donc un POINTEUR sur la structure à la fonction comme elle l'attend.

Remarque bien aussi que tu avais déjà ce problème avec:

LPHANDLE hFax=NULL;

dans ton premier exemple et que j'avais déjà corrigé.... :twisted:

Oui oui je sais, c'est dur l'informatique. D'autant plus dur qu'avec Java tu en faisais pas (de l'informatique) et que maintenant tu dois perdre toutes les mauvaises habitudes acquises.
Mais je veux t'encourager aussi.:
Ce fax il va bientôt partir. :)
Tous les étudiants gavés de Java sont dans la même merde que toi et tôt ou tard, il faut programmer avec un langage informatique quand on est informaticien. Donc c'est bien que tu doives le faire :)
Considère de travailler avec C++, l'idée n'est pas aussi folle qu'il n'y parait

hajer

fredericmazue wrote:

Bref si tu fais ça, tout tes warnings sauf un doivent disparaître. Si j'étais toi j'installerais un 2005 car c'est la solution la plus simple et directe pour toi.

J'ai fait ce que vous dites là, mais j'ai toujours les mêmes warnings...

fredericmazue wrote:

D'ailleurs tu aurais bien meilleur compte à écrire ton code en C++, par e que au niveau où tu l'utilises, il n'y a pas beaucoup de différence avec C, MAIS c'est plus agréable de traiter avec la JNI de Java en C++ qu'en C et finalement c'est là que tu veux en arriver. Bon tu vas me dire que tu connais et pas C++, mais moi je vais te répondre que tu ne connais ni l'un nu l'autre alors autant choisir le mieux :)

J'ai étudié le C au premier semestre l'année dernière, mais comme ça fait longtemps, et que je ne l'utilise pas, j'ai oublié plein de choses

fredericmazue wrote:

3) En C, c'est int main(void) C'est toujours agaçant d'essayer d'aider sur un forum et de voir que les conseils ne sont pas suivis :(


Ah oui dsl, parce que des fois quand j'ai des erreurs que je ne comprends pas, je commence à changer des petits bouts de code dans mon programme, pour voir où sa cloche, j'ai oublié de la remettre

fredericmazue wrote:

MAIS PFAX_JOB_PARAM ça déclare un pointeur et non une strucutre FAX_JOB_PARAM comme tu le crois. C'est même pour ça qu'il y a un P dans le nom. P comme Pointeur. Tu as bien lu la MSDN pourtant:

Oui oui je sais, mais vu que cela fait longtemps que je n'ai pas travaillé avec C, j'ai oublié certains détails...Merci pour le rappel ;-)

fredericmazue wrote:

Considère de travailler avec C++, l'idée n'est pas aussi folle qu'il n'y parait

Là il n'est plus question d'essayer un autre truc, je n'ai plus beaucoup de temps devant moi (1 mois - quelques jours, comprenant la révision des exams, 5 jours d'examens, préparer le rapport de ce projet, finir le projet de site web dynamique et son rapport et la présentation en powerpoint du projet... j'ai du boulot ;-)

Donc revenant au sérieux, voilà j'ai essayé de mieux comprendre le code, et de réctifier certaines erreurs. Mais monsieur le programme ne marche toujours pas, l'erreur qu'il me sort maintenant ressemble à "Run-Time Check Failure #2 - Stack around the variable 'JobParams' was corrupted.", moi à mon avis, ça doit être un problème d'allocation en mémoire de la structure, mais bon je ne sais pas trop.
Bref, voici donc, le code source finalement obtenu, avec quelques petites corrections (mais qui ne marche pas of course)..
J'ai réjouté des commentaires ce que j'ai pu comprendre quant au jeu des pointeurs.

#include <stdio.h> 
#include <windows.h> 
#include <winfax.h> 
#include <winbase.h>
#include <stdlib.h>

#pragma comment(lib, "winfax.lib") 
#pragma comment(lib, "kernel32.lib")
//je vais mettre en commentaire tout ce que j'ai compris concernant FAX_JOB_PARAM...
int main(void){ 
	
	FAX_JOB_PARAM JobParams;//definition de la structure FAX_JOB_PARAM
	PFAX_JOB_PARAM PJobParams;//definition d'un pointeur PJobParams sur la structure FAX_JOB_PARAM		
	HANDLE hFax=NULL;
	LPDWORD FaxJobId=NULL;	
	JobParams.SizeOfStruct=sizeof(FAX_JOB_PARAM);//j'affecte a l'attribut SizeOfStruct la taille de la structure
	JobParams.RecipientNumber="22222222222";
	JobParams.RecipientName="mon binome";
	JobParams.Tsid=NULL;
	JobParams.SenderName="moi";
	JobParams.SenderCompany="INSAT";
	JobParams.SenderDept=NULL;
	JobParams.BillingCode=NULL;
	JobParams.DeliveryReportType=DRT_NONE;
	JobParams.DeliveryReportAddress=NULL;
	JobParams.DocumentName="first step";
	JobParams.CallHandle=NULL;
	JobParams.Reserved[3]=0;
	printf("haloooo\n"); 
	
	if (!FaxConnectFaxServer(NULL, &hFax)){ 
		printf( "\nno no, non connecté"); 
		return 1;
	}  
	else printf("\nconnected to the local fax server");
	PJobParams=&JobParams;//j'affecte au pointeur sur la structure l'adresse de celle ci
	FaxCompleteJobParams(&PJobParams,NULL);/*FaxCompleteJobParams a besoin en paramètre 
	de l'adresse du pointeur sur la structure, c'est que j'ai fait :&PJobParams */ 
	printf("\n on est la");
	if (!FaxSendDocument(hFax,"c:\test_fax1.txt",PJobParams,NULL,FaxJobId)){/*FaxSendDocument a besoin du pointeur 
																			sur la structure en paramètre : PJobParams*/

		printf("\n no no, not sent , %ld \n",GetLastError());
		return 1;
	}
	else printf("\nc bonnn pour l'envoi coooll!!!");
	printf("finiiiii!!!");
	FaxClose(hFax); 
	return 0; 
	//ET MAINTENANT QU'EST CE QUI MANQUE??!! :-(
}

fredericmazue

Quote:
J'ai fait ce que vous dites là, mais j'ai toujours les mêmes warnings...

Ce qu'il y a de bien avec les étudiants c'est la résistance dont ils font preuve à tous propos et toutes occasions. Ca me rappelle quand J'essayais de t'expliquer le pourquoi du comment à propos du port série. :cry: Tous pareil. On leur dit, en s'appuyant sur 25 ans d'expérience et de dur labeur: "comme ça" et 5 minutes après ils reviennent en disant "non non ça marche pas".
Bon sache que j'ai fait moi même comme j'ai dit et que j'ai compilé sous 2005 et 2008 avec seulement le warning HCALL dans les deux cas.
Je ne sais pas ce que tu as fait, mais surement pas comme j'ai dit.

Quote:
Là il n'est plus question d'essayer un autre truc, je n'ai plus beaucoup de temps devant moi

Je sais bien, ça fait au moins trois fois que tu le dis ici où là.
j'essayais de te faire comprendre qu'avec C++ les changements pour envoyer le fax étaient minimes ( int main() au lieu de int main(void) ) MAIS que quand tu arriverais à la JNI tu gagnerais du temps parce que c'est plus facile. Je sais de quoi je parle parce que je connais ça par coeur, en long, en large et en travers. Et que même j'aurais pu t'aider.

Quote:
Donc revenant au sérieux

J'ignorais que ce n'était pas sérieux ce que je disais avant...

Quote:
ce que j'ai pu comprendre quant au jeu des pointeurs

C'est à dire rien puisque tu fais les mêmes fautes.
LPDWORD FaxJobId=NULL; 

C'est la même qu'avant un autre endroit.
Donc

DWORD FaxJobId puis FaxSendDocumentA(hFax,"c:\test_fax1.txt",&JobParams,NULL,&FaxJobId / etc, etc...

encore une fois remarque le &

Il y a une autre erreur mais là c'est plus difficile en effet. C'est là:
JobParams.Reserved[3]=0
Là tu mets pas le tableau à zéro, c'est son adresse que tu mets à zéro (et ça fait encore une pointeur nul décidément...)
Donc je te propose de faire comme ça. Au début du code
FAX_JOB_PARAM JobParams = {0};
puis
//JobParams.Reserved[3]=0;
Autrement dit rien :)

Bon allez je sais que je ne devrais pas vu que c'est pas moi qui passe l'examen, mais voici ton code corrigé (et qui compile et qui marche), à partir du code de ton avant dernier message.

#include <stdio.h> 
#include <windows.h> 
#include <winfax.h> 
#include <winbase.h> 
#include <stdlib.h> 

#pragma comment(lib, "winfax.lib") 
#pragma comment(lib, "kernel32.lib") 

int main(void)
{     
   FAX_JOB_PARAM JobParams = {0};
   PFAX_JOB_PARAM pJobParams = &JobParams;
   HANDLE hFax=NULL; 
   DWORD FaxJobId=NULL;    
   JobParams.SizeOfStruct=sizeof(FAX_JOB_PARAM); 
   JobParams.RecipientNumber="22222222222";//juste un essai 
   JobParams.RecipientName="mon binome"; 
   JobParams.Tsid=NULL; 
   JobParams.SenderName="moi"; 
   JobParams.SenderCompany="INSAT";//ma fac 
   JobParams.SenderDept=NULL; 
   JobParams.BillingCode=NULL; 
   JobParams.DeliveryReportType=DRT_NONE; 
   JobParams.DeliveryReportAddress=NULL; 
   JobParams.DocumentName="first step"; 
   JobParams.CallHandle=NULL; 
   //JobParams.Reserved[3]=0; 
   printf("\nhaloooo"); 
   if (!FaxConnectFaxServer(NULL, &hFax)){ 
      printf( "\no no, non connecté"); 
      return 1; 
   }  
   else printf("\nconnected to the local fax server"); 
   FaxCompleteJobParams(&pJobParams,NULL); 
   if (!FaxSendDocumentA(hFax,"c:\\test_fax1.txt",&JobParams,NULL,&FaxJobId)){ 
      printf("\no no, not sent , %ld \n",GetLastError()); 
      return 1; 
   } 
   else printf("\nc bonnn pour l'envoi coooll!!!"); 
   printf("finiiiii!!!"); 
   FaxClose(hFax); 
   return 0; 
} 

Prière de mettre un bon numéro avant de dire que ça marche pas :twisted:

Par contre pour JNI tu vas devoir te débrouiller sans moi. C'est que je fatigue moi...

Ah :!:
J'allais oublier...
c:\\test_fax1.txt"
\\ screugneugneu, \\ :twisted:

hajer

MERRRCIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII!!!!!!!!!!!!!!
:D :D :D :D :D :D :D

Franchement vous êtes génial génial génial!!!
Non mais faut dire, il y a certaines erreurs (à part celles des pointeurs qui sont des conneries de ma part... je l'avoue :( ) auquelles je ne me serai jamais doutée, surtout que moi j'ai suivi les consignes de la MSDN à la lettre, et j'ai rien mais alors à rien inventer surtout concernant ces deux lignes là (anciennement :wink: ) :

LPDWORD FaxJobId=NULL;

Ce LPDWORD ou DWORD moi je sais presque pas ce que ca veut dire, enfin je sais que DWORD c'est double WORD donc 32 octets, mais j'ai jamais utilisé ce type, alors pour me dire la différence qu'il y a entre DWORD et LPDWORD ...

Quote:
Il y a une autre erreur mais là c'est plus difficile en effet. C'est là:
JobParams.Reserved[3]=0

Je vous jure que j'ai fait mot à mot comme l'a dit la MSDN (pas ma faute à moi donc :D )

FAX_JOB_PARAM JobParams = {0};
et pour ce truc alors, je pourrai jamais penser à ça.
Bon bref maintenant que j'ai mon code... YESSSS
je vais peut être essayer de le rendre en C++ , puisqu'apparemment ça va être dûr avec la JNI dans ce cas.
Et ça me fera un 2 en 1... je m'essairai au moins un peu au C++, plus que notre fac ne nous a pas donné l'honneur de le découvrir :evil:
fredericmazue

Quote:
surtout que moi j'ai suivi les consignes de la MSDN à la lettre

tss tss... que nenni....

Quote:
DWORD et LPDWORD ...

Mille sabords !:!: :evil:
Je te l'ai déjà dit que P c'est pour pointeur. C'est encore une fois de plus toujours à nouveau répétitivement la même erreur que tu fais, déjà signalée pour hFax et déjà moult fois corrigée :evil:

Quote:
Ce LPDWORD ou DWORD moi je sais presque pas ce que ca veut dire

Pardonne moi mais de la part d'un futur diplômé en informatique (ce que je ne suis pas ;) ) c'est assez étrange comme propos.
En plus d'avoir une belle MSDN tu as les en-têtes Windows (ici windef.h) dans lesquelles tu peux voir la défintion des types. D'autant plus facilement que Visual Studio peux t'y emmener d'un clic de souris. Bref dans windef.h tu as:
typedef DWORD far *LPDWORD;

Donc tu vois bien que c'est un pointeur. (tu sais la petite étoile * :) )
Le L maintenant. Il veut dire "long" et est lié au far.
far est un vieux tromblon du temps des Windows 16 bits. Maintenant dans windef.h tu as
#define far
Donc rien finalement, donc le L est là pour des raisons plus historiques que techniques et il ne veut rien dire maintenant en 32 bits. Bref LPDWORD c'est un pointeur de DWORD

Quote:
Je vous jure que j'ai fait mot à mot comme l'a dit la MSDN (pas ma faute à moi donc )

Tu sais la MSDN j'en ai une aussi. Et dans le mienne je ne vois pas JobParams.Reserved[3]=0, je vois "This member is reserved for future use by Microsoft. It must be set to zero. " et comme le membre est un tableau, ça veut dire que le contenu doit être initialisé (set) à zéro et non pas le pointeur dessus ce qui n'aurait aucun sens. Autrement ils auraient dit "it must be NULL" ou "it must be 0"

Tu sais les erreurs dans la MSDN ça arrive, mais globalement c'est quand même assez rare. Quand quelque chose ne va pas, la priorité absolue n'est pas de mettre en cause la MSDN mais plutôt de bien essayer de voir si par hasard le problème ne situerait pas entre la chaise et le clavier :lol:

Quote:
FAX_JOB_PARAM JobParams = {0};
et pour ce truc alors, je pourrai jamais penser à ça

Ce "truc" est du C de base :lol:
Quote:
je vais peut être essayer de le rendre en C++ , puisqu'apparemment ça va être dûr avec la JNI dans ce cas.
Et ça me fera un 2 en 1... je m'essairai au moins un peu au C++, plus que notre fac ne nous a pas donné l'honneur de le découvrir

Dur en C ce n'est pas l'impression que je voudrais te laisser. En C le code est plus lourd et moins naturel qu'en C++.
Mais ce que j'ai voulu dire aussi c'est que JNI en C++ demande peu de C++ si je puis dire. Donc il n'y a pas de difficulté à commencer C++ dans ce contexte bien au contraire. En plus quand on veut être un diplômé en informatique, il me semble que connaître C++ s'impose. C tend quand même à être moins employé, même s'il l'est toujours beaucoup. Enfin bref connaître C++ (et C) ça s'impose pour un diplômé en informatique vu qu'à mon humble avis Java ça n'en est pas de l'informatique. Il faut bien quand même faire un peu d'informatique non ? ;)
Quote:
Bon bref maintenant que j'ai mon code... YESSSS

Code totalement anodin d'une vingtaine de lignes.
Enfin tu as l'air tellement contente que je suis content pour toi :)
Quand tu auras fini ton projet, pour le fun, essaie d'envoyer un fax directement dans le port série en Java directement , juste pour voir.
Et là tu reviendras me dire si oui ou non je t'avais bien conseillé :lol: :lol:

Bon allez, C ou C++, si ça ne va pas comme tu veux avec JNI, n'hésite pas à revenir sur ce forum.

hajer

Me revoilà :D
Bon cette fois - ci je vais pas mettre une tonne de code comme je l'ai fait auparavant :shock:

J'ai trouvé un bon tuto pour utiliser jni avec netbeans en téléchargeant l'ide pour C/C++, voici le lien au cas où
[url]
http://www.netbeans.org/kb/55/beginning-jni-part1.html
[/url]
bon pour ce qui est du principe, j'ai bien compris, en plus ce tuto fait référence au C pour bosser, donc ça m'allait bien.
Bref, tout allait comme sur des roulettes, jusqu'à qu'il m'ait demander de compiler le fichier .C là ce que m'affiche le moniteur c'est, d'abord positif, et puis après il bloque sur établissement des liens.
Voila ce qu'il affiche (pour que ca soit plus clair)

Running "rm -rf build/Debug/Cygwin-Windows/HelloWorldNative.o" in C:\HelloWorldNative


Clean successful. Exit value 0.

Running "c:\cygwin\bin\make.exe -f nbproject/Makefile-Debug.mk build/Debug/Cygwin-Windows/HelloWorldNative.o" in C:\HelloWorldNative

mkdir -p build/Debug/Cygwin-Windows
gcc.exe -mno-cygwin -Wl,--add-stdcall-alias -shared -m32   -c -g3 -gdwarf-2 -IC\:/Program\ Files/Java/jdk1.6.0_03/include -IC\:/Program\ Files/Java/jdk1.6.0_03/include/win32 -o build/Debug/Cygwin-Windows/HelloWorldNative.o HelloWorldNative.c
gcc: --add-stdcall-alias: linker input file unused because linking not done

Build successful. Exit value 0.

biensur dans le tuto (si vous y êtes allé jeter un coup d'oeuil), on me demander d'ajouter certains détails à la configuration du projet, entre autre ajouter des options à la ligne de commander du linker
-mno-cygwin -Wl,--add-stdcall-alias -shared -m32
cette ligne là, je crois que c'est elle le problème.
ou bien c'est du à une mauvaise version de cygwin (sachant que je dois, en l'installant, choisir un site miroir parmi à peu près une cinquantaine), ou bien les options de la ligne de commande sont mal saisis.
bon moi je ne m'y connais pas du tout en ce qui est des lignes de commandes du linker! je découvre ça même!!
Bref (Frédérique) si vous y connaissez quelques choses, ce sera trop cool! A part ça, espérons que ça ira après.

Merci..

Bon, je ne suis pas entrain de tester mon code sur celui du fax, c'est juste le traditionnel "Hello World". Donc... Le plus gros m'attends après

fredericmazue

Quote:
Bref (Frédérique) si vous y connaissez quelques choses, ce sera trop cool! A part ça, espérons que ça ira après.

D'abord c'est Frédéric, parce que Frédérique c'est pour les filles. :evil:

Si j'y connais quelque chose... lol :lol: :lol:

Quote:
cette ligne là, je crois que c'est elle le problème.

Le problème se situe entre la chaise et le clavier. Tu manques du plus élémentaire bon sens.
Je ne dis pas que ce n'est pas une bonne idée de chercher un tutorial sur JNI, au contraire.
Mais il ne faut pas perdre tout bon sens. Tu sais compiler un bout de code C++ avec Visual et qu'est-ce que tu fais là ? Tu vas essayer d'en compiler un sous Netbeans qui est un des plus mauvais outils pour coder en C++ qui soit, surtout sous Windows.
Ton problème n'a rien à voir avec JNI en particulier là. C'est simplement que tu heurtes à un outil que tu ne connais pas, et que tu perds (bêtement) ton temps.

Dis, jusque là on a fait du Visual ensemble. Tu ne crois pas que si il y avait besoin de changer d'outil C/C++ je te l'aurais dit ? :evil:

Bref tu oublies tout ça. Tout ce tuto à la c.. Tout ce que tu as besoin de faire, c'est demander à Visual de te générer une dll pour interfacer avec Java via JNI.

Voici donc la marche à suivre pour régler ton problème rapidement sans perdre ton temps:

- va voir ce tutorial: http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jni.html, celui là, et pas un autre. Tu as tout ce qu'il te faut dedans

- tu GARDES ton Visual et tu fais avec.

Un dernier mot. Dans le tuto ils te donnent les lignes de commandes pour compiler la dll avec Visual. Tu n'as même pas besoin d'aller t'embêter avec ça. Tu le feras aussi bien avec un clic de sous souris dans Visual. Simplement tu crées un priojet Win32 console et après tu donnes DLL comme type d'application. c'est tout...

Allez bon courage :)

hajer

Coucou, bon je voulais juste vous remercier pour votre aide vraiment prodigieuse!!
Je voulais vous dire que j'ai réussi à faire l'application en JAVA avec JNI, j'ai eu beaucoup de mal! Mais j'y suis arrivée :D
Je mettrai le code sur code-source.fr, dès que j'en aurai le temps, et je mettrai un lien ici pour ceux qui en seront intéressés.

Allez à bientôt et THANK YOU VERY MUCH!! 8)

fredericmazue

Quote:
remercier pour votre aide vraiment prodigieuse!!

Le terme est sans doute très exagéré....
Mais un remerciement fait toujours plaisir :)

Quote:
je mettrai un lien ici pour ceux qui en seront intéressés.

Oui avec plaisir.

Et bonne continuation dans tes études :)

hajer

je voulais vous remercier une autre fois, j'ai passé ma soutenance pour le projet hier, et le président du jury (qui est spécialiste en JAVA) a vraiment beacoup apprécié la méthode de la JNI, il était carrément impressionné parce que j'ai fait :D
et ca ca fait plaisir!!!!
donc merci beaucoup frédéric pour ton aide.... prodigieuse (le terme est approprié!!!!) :roll: !!

fredericmazue

Quote:
le président du jury (qui est spécialiste en JAVA)

Lol :lol:

Quote:
vraiment beacoup apprécié la méthode de la JNI

Ben avec les paramètres du problème: Fax, Windows, etc... C'était la méthode. c'est tout :)

Je suis très heureux que ton projet marche fort :)

hajer

http://www.javafr.com/codes/ENVOYER-FAX-JAVA-UTILISANT-JNI_45450.aspx

voila j'ai mis mes sources sur codes-source.com
si vous avez des remarques dessus, faites moi signe, ou s'il y a surtout un fichier manquant ou quoi que ce soit

P.S : merci à frédéric :!: :!: :!: :wink:

fredericmazue

Quote:
si vous avez des remarques dessus

Ben pour bien faire, le nom du fichier à faxer (c:\\test_fax1.txt) ne devrait pas être codé en dur. D'abord pas ce que ça ne se fait pas de coder en dur, question de bons principes. Ensuite si tu manques de chance ton code marche pas. Par exemple le windows depuis lequel j'écris ce post n'est pas sur C: mais sur G: Dans ce cas ton code marche pas et tu peux rien faire puisque c'est codé en dur. Donc moi si j'étais ton prof, je te dirais que tu as écrit là un code qui ne marche pas, en dépit des apparences.

Tu dois pouvoir paramétrer le nom du fichier de fax, et pour ça, en plus de la configuration que tu voudras dans ton code Java, tu dois passer ce nom de fichier à ta routiine, comme tu l'as fait pour le jobjectArray.

Il l'a pas vu ça ton "prof spécialiste de Java" :?: ;) :twisted: :lol:

Ah oui autre chose, mais c'est moins important. Je vois partout printf("t[0], etc

Je pense que tu as voulu faire printf("t[0], printf("t[1], printf("t[2] mais que tu as été victime du fameux piège du copier/coller que tu t'es tendu toi même. :lol:

Pourquoi diable n'as tu pas écrit ta première ligne ainsi:
printf("t[%d] : %s\n", i ,JobParams.RecipientNumber);

Comme ça après en copiant/collant tu n'avais plus besoin de faire attention à l'indice. Un bon informaticien fait travailler l'ordinateur au lieu de travailler lui même. C'est plus reposant et ça évite les bugs. ;)

Ah oui autre chose (oui je sais je suis jamais content et je n'arrête pas de trouver à redire ;) ), quelle horreur cette succession d'instructions if. Voici ce que tu devrais écrire

switch(i)
{
  case 0:
    printf("t[%d] : %s\n", i, JobParams.RecipientNumber);
    break;
  case 1:
    printf("t[%d] : %s\n", i, JobParams.);
    break;
    // etc, etc
  default:
   break;
}

Bon j'arrête là ;)