Ho un programma che usa le API Win32 ma compilando dà 2 errori di funzioni
non risolte (mciSendString e mciGetErrorString).
Questo è il file cpp:
codice:
#include <windows.h>
#include "resource.h"
#define ID_TIMER 1
BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
TCHAR szNomeApp[] = TEXT("TestMCI");
TCHAR szTitolo[] = TEXT("Programma che mostra alcune bitmap nell'area client usando una DLL");
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
{
if(-1 == DialogBox(hInstance, szNomeApp, NULL, DialogProc))
{
MessageBox(NULL, TEXT("Questo programma richiede Windows NT!"), szNomeApp, MB_ICONERROR);
}
return 0;
}
BOOL CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hwndModifica;
int iCarattereInizio, iCarattereFine, iLineaInizio, iLineaFine, iCarattere, iLinea, iLunghezza;
MCIERROR erroreMci;
RECT rect;
TCHAR szComando[1024], szRitorno[1024], szErrore[1024], szBuffer[32];
switch(message)
{
case WM_INITDIALOG:
GetWindowRect(hwnd, &rect);
SetWindowPos(hwnd, NULL, (GetSystemMetrics(SM_CXSCREEN) - rect.right + rect.left) / 2,
(GetSystemMetrics(SM_CYSCREEN) - rect.bottom + rect.top) / 2, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
hwndModifica = GetDlgItem(hwnd, IDC_EDIT_MAIN);
SetFocus(hwndModifica);
return FALSE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
SendMessage(hwndModifica, EM_GETSEL, (WPARAM)&iCarattereInizio, (LPARAM)&iCarattereInizio);
iLineaInizio = SendMessage(hwndModifica, EM_LINEFROMCHAR, iCarattereInizio, 0);
iLineaFine = SendMessage(hwndModifica, EM_LINEFROMCHAR, iCarattereFine, 0);
for(iLinea = iLineaInizio; iLinea <= iLineaFine; iLinea++)
{
*(WORD *)szComando = sizeof(szComando) / sizeof(TCHAR);
iLunghezza = SendMessage(hwndModifica, EM_GETLINE, iLinea, (LPARAM)szComando);
szComando[iLunghezza] = '\0';
if(iLunghezza == 0)
continue;
erroreMci = mciSendString(szComando, szRitorno, sizeof(szRitorno) / sizeof(TCHAR), hwnd);
SetDlgItemText(hwnd, IDC_EDIT_RITORNO, szRitorno);
mciGetErrorString(erroreMci, szErrore, sizeof(szErrore) / sizeof(TCHAR));
SetDlgItemText(hwnd, IDC_EDIT_ERRORE, szErrore);
}
iCarattere = SendMessage(hwndModifica, EM_LINEINDEX, iLineaFine, 0);
iCarattere += SendMessage(hwndModifica, EM_LINELENGTH, iCarattereFine, 0);
SendMessage(hwndModifica, EM_SETSEL, iCarattere, iCarattere);
SendMessage(hwndModifica, EM_REPLACESEL, FALSE, (LPARAM)TEXT("\r\n"));
SetFocus(hwndModifica);
return TRUE;
case IDCANCEL:
EndDialog(hwnd, 0);
return TRUE;
case IDC_EDIT_MAIN:
if(HIWORD(wParam) == EN_ERRSPACE)
{
MessageBox(hwnd, TEXT("Controllo dell'errore fuori dallo spazio"), szNomeApp, MB_OK | MB_ICONINFORMATION);
return TRUE;
}
break;
}
break;
case MM_MCINOTIFY:
EnableWindow(GetDlgItem(hwnd, IDC_NOTIFY_MESSAGGIO), TRUE);
wsprintf(szBuffer, TEXT("ID Device = %i"), lParam);
SetDlgItemText(hwnd, IDC_NOTIFY_ID, szBuffer);
EnableWindow(GetDlgItem(hwnd, IDC_NOTIFY_ID), TRUE);
EnableWindow(GetDlgItem(hwnd, IDC_NOTIFY_SUCCESSFUL), wParam & MCI_NOTIFY_SUCCESSFUL);
EnableWindow(GetDlgItem(hwnd, IDC_NOTIFY_SUPERSEDED), wParam & MCI_NOTIFY_SUPERSEDED);
EnableWindow(GetDlgItem(hwnd, IDC_NOTIFY_ABORTED), wParam & MCI_NOTIFY_ABORTED);
EnableWindow(GetDlgItem(hwnd, IDC_NOTIFY_FAILURE), wParam & MCI_NOTIFY_FAILURE);
SetTimer(hwnd, ID_TIMER, 5000, NULL);
return TRUE;
case WM_TIMER:
KillTimer(hwnd, ID_TIMER);
EnableWindow(GetDlgItem(hwnd, IDC_NOTIFY_MESSAGGIO), FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_NOTIFY_ID), FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_NOTIFY_SUCCESSFUL), FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_NOTIFY_SUPERSEDED), FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_NOTIFY_ABORTED), FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_NOTIFY_FAILURE), FALSE);
return TRUE;
case WM_SYSCOMMAND:
switch(LOWORD(wParam))
{
case SC_CLOSE:
EndDialog(hwnd, 0);
return TRUE;
}
break;
}
return FALSE;
}
Questo è il file header:
codice:
#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif
#define IDD_DIALOG1 100
#define IDC_EDIT_MAIN 1005
#define IDC_EDIT_RITORNO 1006
#define IDC_EDIT_ERRORE 1007
#define IDC_NOTIFY_ID 1008
#define IDC_NOTIFY_SUCCESSFUL 1009
#define IDC_NOTIFY_SUPERSEDED 1010
#define IDC_NOTIFY_ABORTED 1011
#define IDC_NOTIFY_FAILURE 1012
#define IDC_NOTIFY_MESSAGGIO 1013
#define IDC_SEGNALE_ID 1014
#define IDC_SEGNALE_PARAM 1015
#define IDC_SEGNALE_MESSAGGIO 1016
#define IDC_DEVICE 1017
E questo è il file risorsa:
codice:
#include <windows.h>
#include "resource.h"
// Dialog resources
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG1 DIALOG 0, 0, 275, 324
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "Ms Shell Dlg"
{
DEFPUSHBUTTON "OK", IDOK, 53, 305, 50, 14
PUSHBUTTON "Chiudi", IDCANCEL, 180, 305, 50, 14
EDITTEXT IDC_EDIT_MAIN, 5, 5, 265, 125, WS_VSCROLL | ES_AUTOHSCROLL | ES_MULTILINE
LTEXT "Stringa di ritorno:", IDC_STATIC, 5, 144, 54, 8, SS_LEFT
LTEXT "Stringa di errore:", IDC_STATIC, 150, 144, 52, 8, SS_LEFT
EDITTEXT IDC_EDIT_RITORNO, 5, 157, 120, 50, ES_AUTOHSCROLL | ES_MULTILINE | ES_READONLY
EDITTEXT IDC_EDIT_ERRORE, 150, 157, 120, 50, ES_AUTOHSCROLL | ES_READONLY
GROUPBOX "Messaggio MM_MCINOTIFY", IDC_STATIC, 5, 218, 265, 78
LTEXT "MCI_NOTIFY_SUCCESSFUL", IDC_NOTIFY_SUCCESSFUL, 28, 255, 94, 8, SS_LEFT
LTEXT "MCI_NOTIFY_ABORTED", IDC_NOTIFY_ABORTED, 148, 255, 82, 8, SS_LEFT
LTEXT "MCI_NOTIFY_SUPERSEDED", IDC_NOTIFY_SUPERSEDED, 28, 277, 97, 8, SS_LEFT
LTEXT "MCI_NOTIFY_FAILURE", IDC_NOTIFY_FAILURE, 152, 277, 78, 8, SS_LEFT
LTEXT "", IDC_NOTIFY_ID, 26, 236, 1, 8, SS_LEFT
}