Использование приложения из других программ
Использование приложения из других программ
Определение того, что приложение Склонение по падежам установлено на компьютере
Для этого необходимо убедиться, что в реестре Windows есть определённый ключ [SOFTWARE\AAP Software\DeclinationByCase]
TRegistry *reg=new TRegistry(); //Создали обьект reg класса TRegistry
reg->RootKey=HKEY_CURRENT_USER; //Как и при записи указываем раздел с которым будем работать
if (reg->OpenKeyReadOnly("SOFTWARE\\AAP Software\\DeclinationByCase")) ShowMessage("Программа [Склонение по падежам] найдена!");
else ShowMessage("Программа [Склонение по падежам] не установлена!");
reg->CloseKey(); //Закрываем ключ
delete reg; // Освобождаем память
Запуск приложения Склонение по падежам
Читаем из указанной выше ветки значение строкового параметра Path и выполняем запуск этого EXE-файла.
TRegistry *reg=new TRegistry(); //Создали обьект reg класса TRegistry
reg->RootKey=HKEY_CURRENT_USER; //Как и при записи указываем раздел с которым будем работать
if (reg->OpenKeyReadOnly("SOFTWARE\\AAP Software\\DeclinationByCase")) {
UnicodeString ExePath; //Строка в которую мы занесем значение параметра из реестра
ExePath=reg->ReadString("Path"); // Читаем путь, где лежит EXE-файл
ShellExecute(Handle,L"open",ExePath.w_str(),NULL,NULL,SW_SHOWNORMAL);
}
else ShowMessage("Программа [Склонение по падежам] не установлена!");
reg->CloseKey(); //Закрываем ключ
delete reg; //Освобождаем память
Передача слова для склонения в приложение
Для выполнения этого задания понадобятся две вспомогательные функции, которые описаны ниже checkProgRun и WriteToMapFile.
Задаём слово для склонения, проверяем запущена ли наша программа и передаём ей строку через разделяемую память.
//---------------------------------------------------------------------------
// Проверяем запущен ли EXE-файл pname
//---------------------------------------------------------------------------
bool checkProgRun(UnicodeString pname) {
UnicodeString fname;
int l;
bool flag=false;
::PROCESSENTRY32 prj;
prj.dwSize = sizeof(::PROCESSENTRY32);
HANDLE hss;
pname=pname.UpperCase();
hss=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
if (((int)(hss))==(-1)) return(false);
try {
for (bool loop=Process32First(hss, &prj);loop;loop=Process32Next(hss,&prj)) {
fname=UnicodeString(prj.szExeFile).Trim().UpperCase();
fname=get_file_name(fname); // Только имя файла
l=fname.Length();
if (fname==pname) flag=true;
}
}
catch (...) { }
CloseHandle(hss);
return(flag);
}
//---------------------------------------------------------------------------
// Пишем в разделяемую память MapName значение data
//---------------------------------------------------------------------------
bool WriteToMapFile(UnicodeString MapName,UnicodeString data) {
bool res=false;
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
MapName.w_str()); // name of mapping object
if (hMapFile!=NULL) {
pBuf = (LPTSTR) MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,1000);
if (pBuf!=NULL) {
CopyMemory((PVOID)pBuf,data.w_str(),data.Length()*2+2); // Копируем в общую память
UnmapViewOfFile(pBuf); // Снимаем мэппинг
res=true;
}
CloseHandle(hMapFile); // Закрываем дескриптор
}
return(res);
}
//---------------------------------------------------------------------------
s="наше тестовое слово";
if (checkProgRun("DeclinationByCase.exe")) { // Если запущен, то передаем параметры через Shared memory
WriteToMapFile("AAP_PADEZHI_DATA",s);
}
else { // Если не запущен, то запускаем с параметрами
ShellExecute(Handle,L"open",ExePath.w_str(),NULL,NULL,SW_SHOWNORMAL);
}
Created with the Personal Edition of HelpNDoc: Full-featured Help generator