Newsgroup: it.comp.lang.c++
Titolo: *** Ho un problemino ***

Ciao a tutti.
Ho ricopiato un programmino ma nel compilarlo
il VC++ (5.0) dà questo errore:
......
Compiling...
trova.cpp
C:\programmi\DevStudio\MyProjects\trova stringhe\trova.cpp(172) :
 error C2664: 'DialogBoxParamA' : cannot convert parameter 4 from 
'int (void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)(void)'
Error executing cl.exe.
........
a parte quello che dovrebbe diventare il programma e bestialità varie &
commentate,
il mio quesito è rivolto al messaggio di errore del compilatore.
La riga 172 è quella evidenziata dalla freccia:
.....
case WM_COMMAND:
		switch(wParam)
		{
		case IDM_TEXT:
------->			DialogBox((HINSTANCE) GetModuleHandle(NULL),
				"TextInputDiaBox",hWnd,TextDiaProc);
			InvalidateRect(hWnd,NULL,TRUE);
			UpdateWindow(hWnd);
			break;
		case IDM_EXIT:
			SendMessage(hWnd,WM_CLOSE,0,0L);
			break;
		default:
			break;
		}
		break;
---------
l'Help della funzione DialogBox() dice che il quarto parametro deve essere 
un puntatore alla funzione di dialogo.
il prototipo dell amia funzione di dial è :
BOOL CALLBACK TextDiaProc(HWND,UINT,WPARAM,LPARAM);
Quindi credo che passando il nome dell afunzione io gli passo il puntatore
ad essa.
Allora dov'è il trucco ?
Lancio la sfida ai baldi giovani. Al vincitore rivelerò la misura del mio
reggiseno.
                                                                Milla.
---------
segue il sorgente del .cpp e del .rc
file trova.cpp
-------
#include<windows.h>
#include<stdio.h>
#include<string.h>
#include"trova.h"
#define SCROLLLINES 50    
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK TextDiaProc(HWND,UINT,WPARAM,LPARAM);
char szProgName[]="ProgName";
char szApplName[]="Directory";
char myscreen[80]="Esempio di riga di default";
char szMessage[44];
char szMyfile[10];
int sLenght;
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPreInst,
				   LPSTR lpszCmdLine,int nCmdShow)
{
	HWND hWnd;
	MSG lpMsg;
	WNDCLASS wcApp;
// inizializzazione delle variabili della classe di finestra
if(!hPreInst)
{
	wcApp.lpszClassName=szProgName;   
	wcApp.hInstance=hInst;            
	wcApp.lpfnWndProc=WndProc;          
	wcApp.hCursor=LoadCursor(NULL,IDC_ARROW);  
	wcApp.hIcon=0;                             
	wcApp.lpszMenuName=szApplName;                      
	wcApp.hbrBackground=GetStockObject(WHITE_BRUSH); 
	wcApp.style=CS_HREDRAW | CS_VREDRAW;
	wcApp.cbClsExtra=0;
	wcApp.cbWndExtra=0;
// registrazione della classe
	if(!RegisterClass(&wcApp))
		return 0;
}
// creazione della finestra
	hWnd=CreateWindow(szProgName,"Trova stringa",
		              WS_OVERLAPPEDWINDOW|WS_VSCROLL,
	                  CW_USEDEFAULT,
		              CW_USEDEFAULT,
		              CW_USEDEFAULT,
		              CW_USEDEFAULT,
		              (HWND)NULL,(HMENU)NULL,
		              (HANDLE)hInst,(LPSTR)NULL);
// visualizzazione della finestra.
	ShowWindow(hWnd,nCmdShow);
	UpdateWindow(hWnd);
	while(GetMessage(&lpMsg,NULL,0,0)) 
	{
		TranslateMessage(&lpMsg);    
		DispatchMessage(&lpMsg);       
	}
	return(lpMsg.wParam);
}
BOOL CALLBACK TextDiaProc(HWND hdlg,UINT messg,
	  WPARAM wParam,LPARAM lParam)
{
	switch (messg)
	{
	case WM_INITDIALOG:
		return FALSE;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDOK:
			GetDlgItemText(hdlg,IDD_EDIT,myscreen,80);
			EndDialog(hdlg,TRUE);
			break;
		case IDCANCEL:
			EndDialog(hdlg,FALSE);
            break;
		default:
			return FALSE;
		}
		break;
	default:
		return FALSE;
	}
return TRUE;
}
//---------------------------------------------------------------------
LONG WINAPI WndProc(HWND hWnd,UINT messg,
		 WPARAM wParam,LONG lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	HANDLE hFindFile;
	WIN32_FIND_DATA ffd;
	TEXTMETRIC tm;
	BOOL fRC;
	LPTSTR lpszSearchFile= "*.*";
	static FARPROC fpfnTextDiaProc;
	static HWND hInst2;
	int i;
	int charht=16;
	static int ldHPos,OldVPos,NewVPos;
	static int yClientView;
	switch(messg)
	{
	case WM_CREATE:
		hInst2=((LPCREATESTRUCT)lParam)->hInstance;
		fpfnTextDiaProc=MakeProcInstance((FARPROC)TextDiaProc,hInst2);
		break;
//-------------------------------------------------------------------
	case WM_SIZE:
		yClientView=HIWORD(lParam);
		break;
//-------------------------------------------------------------------
	case WM_VSCROLL:
        switch(LOWORD(wParam))
		{
		case SB_PAGEDOWN:
			OldVPos=GetScrollPos(hWnd,SB_VERT);
			SetScrollPos(hWnd,SB_VERT,(OldVPos+10),TRUE);
			NewVPos=GetScrollPos(hWnd,SB_VERT);
			break;
		case SB_LINEDOWN:
			OldVPos=GetScrollPos(hWnd,SB_VERT);
			SetScrollPos(hWnd,SB_VERT,(OldVPos+1),TRUE);
			NewVPos=GetScrollPos(hWnd,SB_VERT);
			break;
		case SB_PAGEUP:
			OldVPos=GetScrollPos(hWnd,SB_VERT);
			SetScrollPos(hWnd,SB_VERT,(OldVPos-10),TRUE);
			NewVPos=GetScrollPos(hWnd,SB_VERT);
			break;
		case SB_LINEUP:
			OldVPos=GetScrollPos(hWnd,SB_VERT);
			SetScrollPos(hWnd,SB_VERT,(OldVPos-1),TRUE);
			NewVPos=GetScrollPos(hWnd,SB_VERT);
			break;
		case SB_THUMBPOSITION:
			OldVPos=GetScrollPos(hWnd,SB_VERT);
        	NewVPos=HIWORD(wParam);
			SetScrollPos(hWnd,SB_VERT,(OldVPos+1),TRUE);
			break;
		}
		InvalidateRect(hWnd,NULL,TRUE);
		break;
//-------------------------------------------------------------------
	case WM_COMMAND:
		switch(wParam)
		{
		case IDM_TEXT:
			DialogBox((HINSTANCE) GetModuleHandle(NULL),
				"TextInputDiaBox",hWnd,TextDiaProc);
			InvalidateRect(hWnd,NULL,TRUE);
			UpdateWindow(hWnd);
			break;
		case IDM_EXIT:
			SendMessage(hWnd,WM_CLOSE,0,0L);
			break;
		default:
			break;
		}
		break;
//-------------------------------------------------------------------
	case WM_PAINT:
		hdc=BeginPaint(hWnd,&ps);
/*
        if((fp=fopen("pippo","r"))!=NULL)
		{	
			i=0;
			while(!feof(fp))
			{
    			ch=fgetc(fp);
 				if(ch=='\n') 
					ch= ' ';
				szBuffer[i]=(char)ch;
				i++;
			}
			szBuffer[i--]=' ';
			TextOut(hdc,xClientView-(NewHPos*charwt),
				    charwt,szBuffer,i);
		}
		fclose(fp);
		TextOut(hdc,170,150,szPMessg1,28);
		TextOut(hdc,230,170,szPMessg2,9);
*/
		i=0;
		SetCurrentDirectory(szMyfile);
		hFindFile=FindFirstFile(lpszSearchFile,&ffd);
		sLenght=sprintf(szMessage,ffd.cFileName);
		TextOut(hdc,0,charht*(i-NewVPos),szMessage,sLenght);
		i++;
		for(;;)
		{
			fRC=FindNextFile(hFindFile,&ffd);
			if(fRC==FALSE)
			{
				FindClose(hFindFile);
				break;
			}
			else
				FindNextFile(hFindFile,&ffd);
        		sLenght=sprintf(szMessage,ffd.cFileName);
                TextOut(hdc,0,charht*(i-NewVPos),szMessage,sLenght);
				i++;
		}
// fine routine di lavoro 
		ValidateRect(hWnd,NULL);
		EndPaint(hWnd,&ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return(DefWindowProc(hWnd,messg,wParam,lParam));
	}
	return(0);
}
--------------
File trova.rc
--------------
#include "windows.h"
#include "trova.h"
 
Directory MENU
{
	POPUP "&Elenco Files"
	{
		MENUITEM "Files A:", IDM_AFILES
		MENUITEM "Files B:", IDM_BFILES
		MENUITEM "Files C:", IDM_CFILES
		MENUITEM "Files D:", IDM_DFILES
	}
}
TextInputDiaBox DIALOG 6,18,160,63
STYLE DS_MODALFRAME|WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU
CAPTION "Immissione di testo"
FONT 8, "MS Sans Serif"
{
	LTEXT "Immettere la directory:", -1,6,6,66,8
	EDITTEXT,IDD_EDIT,7,20,143,12,ES_AUTOHSCROLL
	PUSHBUTTON "OK",IDOK,21,38,40,14
	PUSHBUTTON "Annulla",IDCANCEL,95,39,40,14
}

Se non sbaglio devi definire STRICT prima di includere windows.h per avere
le definizioni delle funzioni fatte in modo rigoroso (come te le fa vedere
l'help).
#define STRICT
#include <windows.h>
Ciao
Antonio Donatiello

il VC++ (5.0) dą questo errore:
Devi garantire che STRICT sia definita (con VC++6
mi pare sia il default, comunque porre STRICT fra le
variabili predefinite del progetto non e` un problema).
Alex