Bonjour,

Je cherche à imprimer un fichier texte au format rtf.

J'ai récupéré une première méthode qui imprime directement le fichier sur une imprimante. Par contre, je ne comprends pas son fonctionnement:
1) Comment savoir quelle imprimante est sélectionnée?
2) Pourquoi le fait de créer ce process signifie t'il l'impression du document?

Voici le code:
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
 
ret_error = GetSystemDirectory(c_sysdir,_MAX_PATH);
	ASSERT(ret_error!=0);
 
	sprintf(c_RsFile,"%s\\rs.ini",c_sysdir);
 
	//Check for WordPad path
	GetPrivateProfileString("WORDPAD","PATH","NO",temp,_MAX_PATH,RsFile);
	CString WordpadPath;
	WordpadPath.Format("%s",temp);
 
	if (WordpadPath=="NO")
	{
		AfxMessageBox("WordPad application not installed. Please install this component from Windows installation disk.");
	}
	else
	{
		WordpadPath+=" ";
		WordpadPath+=m_sNomFic; //nom du fichier à imprimer
		WordpadPath+=" /p";
		char commandline[1024];
		int i;
		for (i=0;i<WordpadPath.GetLength();i++)
			commandline[i]=WordpadPath.GetAt(i);
		commandline[i]=0;
 
		STARTUPINFO si;
		PROCESS_INFORMATION pi;
		ZeroMemory( &si, sizeof(si) );
		si.cb = sizeof(si);
 
		if( !CreateProcess( NULL, // No module name (use command line). 
		commandline, // Command line. 
		NULL,             // Process handle not inheritable. 
		NULL,             // Thread handle not inheritable. 
		FALSE,            // Set handle inheritance to FALSE. 
		0,                // No creation flags. 
		NULL,             // Use parent's environment block. 
		NULL,             // Use parent's starting directory. 
		&si,              // Pointer to STARTUPINFO structure.
		&pi ))             // Pointer to PROCESS_INFORMATION structure.    
		{
			AfxMessageBox( "CreateProcess failed." );    
		}
 
		// Wait until child process exits.
		WaitForSingleObject( pi.hProcess, INFINITE );
 
		// Close process and thread handles.     CloseHandle( pi.hProcess );
		CloseHandle( pi.hThread );
 
	}

Une autre méthode que je désire mettre en place est celle décrite dans la faq. Le problème est que je n'imprime rien alors que windows m'avertit bien que le document a été envoyée à l'imprimante. Le nom de l'imprimante et de ce document sont bien ceux désirés.

Voici le code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
if(OpenPrinterDirect(list[1].pPrinterName,commandline))
	{
		//WritePrinterString("essai d'impression\n");
		ClosePrinterDirect();
	}
commandline représente le nom du document.
WritePrinterString affiche bien la ligne attendue. Je l'ai mis en commentaire car je souhaite imprimer le document dont je passe le chemin.
Peut être dois donc utiliser impérativement WritePrinterString() avec comme paramètre le buffer contenant mes données mais dans ce cas, pourquoi donc passer comme paramètre le chemin du document à imprimer?! de plus quand j'ai fais celan ca m'a imprimé sur des pages différentes les balises rtf...

Les fonctions appellées:
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
bool CHistoriqueDlg::OpenPrinterDirect(char* szPrinterName, char* szDocName)
{
   DOC_INFO_1 di;
   di.pDocName = szDocName; 
   di.pOutputFile = NULL;
   di.pDatatype = "RAW";
 
   if ( !OpenPrinter(szPrinterName, &HandlePrinter, NULL ) )  return false;
   if ( StartDocPrinter( HandlePrinter, 1, (LPBYTE)&di ) == 0 ) return false;
   if ( !StartPagePrinter( HandlePrinter ) ) return false;
 
   return true;
}
 
bool CHistoriqueDlg::ClosePrinterDirect()
{
    if ( !EndPagePrinter(HandlePrinter ) )return false;
    if ( !EndDocPrinter(HandlePrinter) )return false;
    if ( !ClosePrinter(HandlePrinter) )return false;
    HandlePrinter=NULL;
   return true;
}
 
BOOL CHistoriqueDlg::WritePrinterString(const char *sz)
{
   DWORD bw;
   return WritePrinter(HandlePrinter, (void*)sz,strlen(sz),&bw);
}
Nicolas