#include "definition.h"
//освен файла "definition.h" всички други файлове
//не са задължителни за модула, тяхното включване
//зависи само от това какво ще се прави с
//този модул
#include "movie_plugin_1.h"
#include "resource.h"
#include "windows.h"
#include "commdlg.h"
#include "shellapi.h"
#include "mmsystem.h"
//максималната дължина на стринговете
#define MAX_STR_LEN 1024
//името на секцията в INI файла където ще се
//записват данните за модула
#define INI_SECTION "CD Player"
//с този ключ се записва пътя към файла
#define INI_KEY "apppath"
//стойност по подразбиране
#define INI_DEF "No data!"
//стрингове които се показват в диалога за
//настройки на модула
#define STR_LOAD "Ако желаете при натискане на бутона
STANDBY да стартирате RealMagic DVD въведете пътя до
файла \"Station.exe\"."
//текст на бутона за отваряне на "Open dialog"
#define STR_BROWSE_BTN "Намери"
//текст на "OK" бутона
#define STR_OK_BTN "Да"
//текста на "CANCEL" бутона
#define STR_CANCEL_BTN "Откажи"
//описание на модула
#define STR_PRGDATA "Данни за модула :"
//име на файла на контролираната програма
#define STR_EXEFILE "Файл на управляваното приложение:
Sation.exe"
//версия на управляваното приложение
#define STR_APPVER "Версия на управляваното приложение : 1.0"
//версия на модула
#define STR_PLGVER "Версия на модула за управление на
CD Player : 1.0"
//име на собственика
#define STR_MAKER "Алфа Интелект. Всички права запазени!"
//WEB страница
#define STR_WEB "www.mediamax2.com"
//e-mail адрес
#define STR_MAIL "alpha@acvilon.com"
//с тази структура се предават данни за модула към Media Max
//някои от полетата не са задължителни
struct plugindata
{
// HWND на прозореца на Media Max
HWND mmhWnd;
// HWND на контролираната програма
HWND apphWnd;
// HINSTANCE на DLL файла
HINSTANCE dllhIns;
// име на файла на управляваната програма
char appfileName [MAX_STR_LEN];
// име на модула
char pluginName [MAX_STR_LEN];
// име на програмата която се контролира
char appName [MAX_STR_LEN];
// версия на модула
char pluginversion [MAX_STR_LEN];
// описание на модула
char description [MAX_STR_LEN];
// името с което ще се записва модула във INI файла
char keyname [MAX_STR_LEN];
// типа на модула
// ако има стойност 1 - системен модул
// ако има стойност 2 - модул за управляване на програми
DWORD plugintype;
};
//променливи за шрифтовете
LOGFONT lf;
HFONT hf;
//променливи за записване във INI файла
OPENFILENAME Ofn;
char strFile [MAX_STR_LEN];
char szFile [MAX_STR_LEN];
char pluginPath [MAX_STR_LEN];
char* ppos;
//променлива от структурата за предаване на данни
//между Media Max и модула
plugindata myData;
//HWND към прозореца на бутон
//използва се само в тоси модул
HWND buttonHwnd;
//HWND към прозореца на управляваната програма
HWND mainHwnd;
char screentext [MAX_STR_LEN];
//тези променливи се използват за да може да се забави
//предаването на команди от пулта за дистанционно
//управление към програмата която се управлява
__int64 dTime;
__int64 cTime;
__int64 bTime;
//периода през които е забранено да се предават команди
__int64 period;
//тези променливи се използват за да може да управлява
//силата на звука на CD Playera, понеже той няма възможност
//за това и се използва "Master Volume Control" на Windows
UINT nNumMixers;
HMIXER hMixer;
MIXERCAPS mxcaps;
DWORD soundMinimum;
DWORD soundMaximum;
DWORD volumeControlID;
BOOL audio_flag;
DWORD volume_value;
DWORD volume_step;
//функцията за обработка на съобщенията от диалога
//за настройки на модула
LRESULT CALLBACK PropertiesDlg (HWND, UINT, WPARAM, LPARAM);
//деклариране на експортните функции на DLL файла
extern "C" __declspec (dllexport)
plugindata* GetPlugInData();
extern "C" __declspec (dllexport)
void SetPlugInData(plugindata* data);
extern "C" __declspec (dllexport)
BOOL MessageProc(UINT message);
extern "C" __declspec (dllexport)
char* ScreenTextProc(UINT message);
extern "C" __declspec (dllexport) BOOL IsAppRun();
extern "C" __declspec (dllexport) DWORD InitProc();
extern "C" __declspec (dllexport) DWORD QuitProc();
extern "C" __declspec (dllexport) DWORD ConfigProc();
//входната функция на DLL файла
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//следващите няколко функции са за управление на звука
//******************************************************
//инициализира звуковите устройства
BOOL soundInitialize()
{
nNumMixers = mixerGetNumDevs();
hMixer = NULL;
ZeroMemory(&mxcaps, sizeof(MIXERCAPS));
soundMinimum = 0;
soundMaximum = 0;
volumeControlID = 0;
if (nNumMixers != 0)
{
if (mixerOpen(&hMixer,
0,
NULL,
NULL,
MIXER_OBJECTF_MIXER )
!= MMSYSERR_NOERROR)
{
return FALSE;
}
if (mixerGetDevCaps(reinterpret_cast(hMixer),
&mxcaps, sizeof(MIXERCAPS))
!= MMSYSERR_NOERROR)
{
return FALSE;
}
}
return TRUE;
}
//затваря отворените звукови устройства
BOOL soundUninitialize()
{
BOOL bSucc = TRUE;
if (hMixer != NULL)
{
bSucc = (mixerClose(hMixer) == MMSYSERR_NOERROR);
hMixer = NULL;
}
return bSucc;
}
//намира главното устройство за контрол на звука
BOOL soundGetMasterVolumeControl()
{
if (hMixer == NULL)
{
return FALSE;
}
MIXERLINE mxl;
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
if (mixerGetLineInfo(reinterpret_cast(hMixer),
&mxl,
MIXER_OBJECTF_HMIXER |
MIXER_GETLINEINFOF_COMPONENTTYPE)
!= MMSYSERR_NOERROR)
{
return FALSE;
}
MIXERCONTROL mxc;
MIXERLINECONTROLS mxlc;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = mxl.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;
if (mixerGetLineControls(reinterpret_cast(hMixer),
&mxlc,
MIXER_OBJECTF_HMIXER |
MIXER_GETLINECONTROLSF_ONEBYTYPE)
!= MMSYSERR_NOERROR)
{
return FALSE;
}
soundMinimum = mxc.Bounds.dwMinimum;
soundMaximum = mxc.Bounds.dwMaximum;
volume_step = mxc.Bounds.dwMaximum / 20;
volumeControlID = mxc.dwControlID;
return TRUE;
}
// получава стойността на силата на звука
BOOL soundGetMasterVolumeValue(DWORD &dwVal)
{
if (hMixer == NULL)
{
return FALSE;
}
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = volumeControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
if (mixerGetControlDetails(reinterpret_cast(hMixer),
&mxcd,
MIXER_OBJECTF_HMIXER |
MIXER_GETCONTROLDETAILSF_VALUE)
!= MMSYSERR_NOERROR)
{
return FALSE;
}
dwVal = mxcdVolume.dwValue;
return TRUE;
}
// задава нова стойност на силата на звука
BOOL soundSetMasterVolumeValue(DWORD dwVal)
{
if (hMixer == NULL)
{
return FALSE;
}
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume = { dwVal };
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = volumeControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
if (mixerSetControlDetails(reinterpret_cast(hMixer),
&mxcd,
MIXER_OBJECTF_HMIXER |
MIXER_SETCONTROLDETAILSF_VALUE)
!= MMSYSERR_NOERROR)
{
return FALSE;
}
return TRUE;
}
//***********************************************
//край на функциите за контрол на звука
//от тука започва основната част от кода на модула
//************************************************
//тази функция се извиква през 1 секунда от Media Max
//и чрез нея се определя дали е активан програмата
//за която е саздаден този модул
BOOL IsAppRun ()
{
mainHwnd = FindWindow ("SJE_CdPlayerClass",NULL);
myData.apphWnd = mainHwnd;
if (mainHwnd != 0)
{
if (mainHwnd == GetForegroundWindow()) return TRUE;
}
return FALSE;
}
// тази функция се извиква от Media Max за да се изведе
//командата на монитора при натискане на бутон от пулта
//за дистанционно управление
char* ScreenTextProc (UINT message)
{
strcpy (screentext,"");
switch (message)
{
case IR_VOLUP:
strcpy (screentext, "VOL +");
break;
case IR_VOLDOWN:
strcpy (screentext, "VOL -");
break;
case IR_PLAY:
strcpy (screentext, "PLAY");
break;
case IR_STOP:
strcpy (screentext, "STOP");
break;
case IR_PREV:
strcpy (screentext, "PREV");
break;
case IR_NEXT:
strcpy (screentext, "NEXT");
break;
case IR_PAUSE:
strcpy (screentext, "PAUSE");
break;
case IR_REWIND:
strcpy (screentext, "REWIND");
break;
case IR_FFWD:
strcpy (screentext, "FFWD");
break;
case IR_DISC:
strcpy (screentext, "FULL SCR");
break;
case IR_SLEEP:
strcpy (screentext, "SLEEP");
break;
case IR_NEWS:
strcpy (screentext, "MIN/MAX");
break;
case IR_DSC:
strcpy (screentext, "MUTE");
break;
case IR_COMMON1:
strcpy (screentext, "1");
break;
case IR_COMMON2:
strcpy (screentext, "2");
break;
case IR_CPMMON3:
strcpy (screentext, "3");
break;
case IR_COMMON4:
strcpy (screentext, "4");
break;
case IR_COMMON5:
strcpy (screentext, "5");
break;
case IR_COMMON6:
strcpy (screentext, "6");
break;
case IR_COMMON7:
strcpy (screentext, "7");
break;
case IR_COMMON8:
strcpy (screentext, "8");
break;
case IR_COMMON9:
strcpy (screentext, "9");
break;
case IR_COMMON10:
strcpy (screentext, "0");
break;
case IR_COMMON11:
strcpy (screentext, "-/--");
break;
case IR_STANDBY:
//strcpy (screentext, "");
break;
}
return screentext;
}
//в тази функция се изпълняват необходимите действия
//за да може всяко натискане на бутона от пулта за
//дистанционно управление да се преобразува в команда
//към съответната програма
BOOL MessageProc (UINT message)
{
//ако няма валиден HWND към прозореца на контролираната
//програма се излиза от функцията
//прави се само изключение за командата "IR_STANDBY"
//понеже при стартиране на самата програма от
//бутона "STANDBY"
//още няма валиден HWND
if ((mainHwnd == NULL) && (message != IR_STANDBY))
return FALSE;
switch (message)
{
//увеличаване на звука
case IR_VOLUP:
//взема се стойността на таймера
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
//ако новата команда е пристигнала преди да е изтекъл
//периода, тя не се обработва
if ((cTime - bTime) > period)
{
if (audio_flag)
{
soundGetMasterVolumeValue(volume_value);
if ((volume_value + volume_step) < soundMaximum)
volume_value += volume_step;
soundSetMasterVolumeValue (volume_value);
}
//взема новата стойност на таймера
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
//запазва я в "bTime"
bTime = cTime;
}
break;
//намаляване на звука
case IR_VOLDOWN:
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
if ((cTime - bTime) > period)
{
if (audio_flag)
{
if ((volume_value - volume_step) > soundMinimum)
volume_value -= volume_step;
soundSetMasterVolumeValue (volume_value);
}
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
bTime = cTime;
}
break;
// команда PLAY
case IR_PLAY:
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
if ((cTime - bTime) > period*8)
{
SendMessage (mainHwnd, WM_COMMAND,
(WPARAM) 0x000003e8,
(LPARAM) 0x00000000);
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
bTime = cTime;
}
break;
//команда STOP
case IR_STOP:
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
if ((cTime - bTime) > period*8)
{
SendMessage (mainHwnd, WM_COMMAND,
(WPARAM) 0x000003e9,
(LPARAM) 0x00000000);
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
bTime = cTime;
}
break;
//команда PREV
case IR_PREV:
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
if ((cTime - bTime) > period*8)
{
SendMessage (mainHwnd, WM_COMMAND,
(WPARAM) 0x000003eb,
(LPARAM) 0x00000000);
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
bTime = cTime;
}
break;
//команда NEXT
case IR_NEXT:
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
if ((cTime - bTime) > period*8)
{
SendMessage (mainHwnd, WM_COMMAND,
(WPARAM) 0x000003ee,
(LPARAM) 0x00000000);
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
bTime = cTime;
}
break;
//команда PAUSE
case IR_PAUSE:
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
if ((cTime - bTime) > period*8)
{
SendMessage (mainHwnd, WM_COMMAND,
(WPARAM) 0x000003e9,
(LPARAM) 0x00000000);
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
bTime = cTime;
}
break;
//команда REWIND
case IR_REWIND:
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
if ((cTime - bTime) > period)
{
buttonHwnd = GetDlgItem (mainHwnd, 1004);
SendMessage (buttonHwnd, WM_LBUTTONDOWN,
(WPARAM) 0x00000001,
(LPARAM) 0x000a0008);
SendMessage (buttonHwnd, WM_LBUTTONUP,
(WPARAM) 0x00000000,
(LPARAM) 0x000a0008);
bTime = cTime;
}
break;
//команда FFWD
case IR_FFWD:
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
if ((cTime - bTime) > period)
{
buttonHwnd = GetDlgItem (mainHwnd, 1005);
SendMessage (buttonHwnd, WM_LBUTTONDOWN,
(WPARAM) 0x00000001,
(LPARAM) 0x000a0008);
SendMessage (buttonHwnd, WM_LBUTTONUP,
(WPARAM) 0x00000000,
(LPARAM) 0x000a0008);
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
bTime = cTime;
}
break;
//команда STOP
case IR_DISC:
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
if ((cTime - bTime) > period*8)
{
SendMessage (mainHwnd, WM_COMMAND,
(WPARAM) 0x000003ea,
(LPARAM) 0x00000000);
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
bTime = cTime;
}
return FALSE;
break;
//команда SLEEP
//тази функция връща FLASE понеже се обработва
//от Media Max
case IR_SLEEP:
return FALSE;
break;
//команда за MAXIMIZE или MINIMIZE на прозореца
//на управляваната програма
case IR_NEWS:
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
if ((cTime - bTime) > period*8)
{
if (mainHwnd != 0)
if (IsIconic(mainHwnd))
{
ShowWindow (mainHwnd, SW_SHOWNORMAL);
}
else
{
ShowWindow (mainHwnd, SW_MINIMIZE);
}
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
bTime = cTime;
}
break;
//команда ZOOM/JMP - в този модул се използва
//за отваряне на вратичката на CD-ROM устройството
case IR_DSC:
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
if ((cTime - bTime) > period*8)
{
SendMessage (mainHwnd, WM_COMMAND,
(WPARAM) 0x000003ef,
(LPARAM) 0x00000000);
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
bTime = cTime;
}
break;
//команда STANDBY, тази команда се предава към модула само ако в
//настройките на Media Max e избрано "Дефинирано в модула"
case IR_STANDBY:
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
if ((cTime - bTime) > period*8)
{
//ако програната е стартиране се спира
//с кмбинация "Alt+F4"
mainHwnd = FindWindow ("SJE_CdPlayerClass",NULL);
if (mainHwnd != NULL)
{
keybd_event( VK_MENU ,0 ,0 ,0 );
keybd_event( VK_F4 ,0 ,0 ,0 );
keybd_event( VK_F4 ,0 ,KEYEVENTF_KEYUP,0 );
keybd_event( VK_MENU ,0 ,KEYEVENTF_KEYUP ,0 );
}
else
{
//ако програмата не е стартирана,
//но е записан патя до нея
//в INI файла се стартира от там
if (MAX_STR_LEN > GetModuleFileName (NULL,
pluginPath, MAX_STR_LEN))
{
ppos = strrchr (pluginPath,92);
*ppos = 0;
strcat (pluginPath, "\\plugin\\plugin.ini");
if (0 != GetPrivateProfileString (INI_SECTION,
INI_KEY,
INI_DEF,
szFile,
MAX_STR_LEN,
pluginPath))
{
ShellExecute (myData.mmhWnd,
NULL,
szFile,
NULL,
NULL,SW_SHOWNORMAL );
}
}
}
QueryPerformanceCounter ((LARGE_INTEGER *) &cTime);
bTime = cTime;
}
break;
}
return TRUE;
}
//предава на Media Max структурата с данните на модула
plugindata* GetPlugInData ()
{
return &myData;
}
//с тази функция Media Max допълва данните
//към структурата на модула
void SetPlugInData (plugindata* data)
{
memcpy (&myData, data, sizeof(plugindata));
}
// функция за инициализация на модула
//извиква се от Media Max при зареждане на модула
DWORD InitProc ()
{
double d_buffer;
//името на EXE файла на контролираната програма
strcpy (myData.appfileName, "cdplayer.exe");
//името на този модул
strcpy (myData.pluginName, "CD Player1.0");
//името на програмата
strcpy (myData.appName, "CD Player");
//версия на модула
strcpy (myData.pluginversion, "v1.0");
//описание на модула
strcpy (myData.description,
"Media Max plugin module (CD Player) - v1.2 2001 ");
//тип на модула
myData.plugintype = 2;
//зарежда се честотата на таймера на данната платка
QueryPerformanceFrequency((LARGE_INTEGER *)&dTime);
//изчислява се периода на забрана за предаване на команди
//неговата стойност не е критична
//наглася се такава стойност, с която да не се
//предават командите прекалено бързо
d_buffer = 1000000/(double)dTime;
d_buffer = 41000 / d_buffer;
period = (__int64)d_buffer;
audio_flag = FALSE;
//инициализира звуковите устройства
if (soundInitialize())
{
audio_flag = TRUE;
soundGetMasterVolumeControl();
soundGetMasterVolumeValue(volume_value);
}
return 0;
}
//тази функция се извиква преди да се унищожи
//модула от Media Max
DWORD QuitProc ()
{
soundUninitialize();
return 0;
}
//тази функция се извиква когато ще се конфигурира модула
DWORD ConfigProc ()
{
DialogBox (myData.dllhIns,
(LPCTSTR)IDD_DIALOG1,
myData.mmhWnd,
(DLGPROC) PropertiesDlg);
return 0;
}
//зарежда стринговете на диалога за настройки
//зарежда и шрифтовете на контролите
DWORD LoadStringData (HWND hDlg, char* strdata, UINT itemnum)
{
HWND itemhWnd;
if (hf == NULL) return 0;
itemhWnd = GetDlgItem (hDlg, itemnum);
SendMessage (itemhWnd,
WM_SETFONT,
(WPARAM) hf,
(LPARAM) TRUE);
SetDlgItemText (hDlg, itemnum, strdata);
return 0;
}
//функцията за обработка на съобщенията от диалога
// за настройки
LRESULT CALLBACK PropertiesDlg (HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
memset(&lf, 0, sizeof(LOGFONT));
lf.lfHeight = -10;
lf.lfWeight = FW_NORMAL;
lf.lfCharSet = RUSSIAN_CHARSET;
strcpy((LPSTR)&(lf.lfFaceName), "MS Sans Serif");
hf = CreateFontIndirect(&lf);
if (MAX_STR_LEN > GetModuleFileName (NULL,
pluginPath,
MAX_STR_LEN))
{
ppos = strrchr (pluginPath,92);
*ppos = 0;
strcat (pluginPath, "\\plugin\\plugin.ini");
if (0 != GetPrivateProfileString (INI_SECTION,
INI_KEY,
INI_DEF,
szFile,
MAX_STR_LEN,
pluginPath))
{
SetDlgItemText (hDlg, IDC_EDIT1, szFile);
}
}
LoadStringData (hDlg, STR_LOAD, IDC_LOAD);
LoadStringData (hDlg, STR_BROWSE_BTN, IDC_BUTTON1);
LoadStringData (hDlg, STR_OK_BTN, IDOK);
LoadStringData (hDlg, STR_CANCEL_BTN, IDCANCEL);
LoadStringData (hDlg, STR_PRGDATA, IDC_PRGDATA);
LoadStringData (hDlg, STR_EXEFILE, IDC_EXEFILE);
LoadStringData (hDlg, STR_APPVER, IDC_APPVER);
LoadStringData (hDlg, STR_PLGVER, IDC_PLGVER);
LoadStringData (hDlg, STR_MAKER, IDC_MAKER);
LoadStringData (hDlg, STR_WEB, IDC_WEB);
LoadStringData (hDlg, STR_MAIL, IDC_MAIL);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_BUTTON1:
szFile[0] = '\0';
Ofn.lStructSize = sizeof(OPENFILENAME);
Ofn.hwndOwner = NULL;//hWnd;
Ofn.lpstrFilter = "Application\0*.exe\0\0";
Ofn.lpstrCustomFilter = (LPSTR)NULL;
Ofn.nMaxCustFilter = 0L;
Ofn.nFilterIndex = 1L;
Ofn.lpstrFile = szFile;
Ofn.nMaxFile = sizeof(strFile);
Ofn.lpstrFileTitle = strFile;
Ofn.nMaxFileTitle = sizeof("Open");
Ofn.lpstrInitialDir = (LPSTR) NULL;
Ofn.lpstrTitle = (LPSTR)NULL;
Ofn.Flags = OFN_SHOWHELP |
OFN_PATHMUSTEXIST |
OFN_FILEMUSTEXIST;
Ofn.nFileOffset = 0;
Ofn.nFileExtension = 0;
Ofn.lpstrDefExt = "exe";
Ofn.lpstrInitialDir = "c:\\Program Files" ;
if (0 != GetOpenFileName(&Ofn))
{
SetDlgItemText (hDlg, IDC_EDIT1, szFile);
}
break;
case IDOK:
//записва новите настройки на модула в INI файла
if (0 == GetDlgItemText (hDlg,
IDC_EDIT1,
szFile,
MAX_STR_LEN)) return FALSE;
if (MAX_STR_LEN > GetModuleFileName (NULL,
pluginPath,
MAX_STR_LEN))
{
ppos = strrchr (pluginPath,92);
*ppos = 0;
strcat (pluginPath, "\\plugin\\plugin.ini");
WritePrivateProfileString (INI_SECTION,
INI_KEY,
szFile,
pluginPath);
}
if (hf != NULL) DeleteObject (hf);
EndDialog(hDlg, LOWORD(wParam));
break;
case IDCANCEL:
if (hf != NULL) DeleteObject (hf);
EndDialog(hDlg, LOWORD(wParam));
break;
}
break;
}
return FALSE;
}
|