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
}