Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Those haven't a nick
Зарегистрирован: 16.05.2007 Сообщения: 2
|
Добавлено: Ср Май 16 2007 21:49 Заголовок сообщения: Два вопроса по C++Builder |
|
|
Вопрос номер раз: сожноли в C++B в свойствах проекта задать значение языка приложения "независимо от языка"?
Вопрос два: Как не допустить запуска второй копии приложения? Хочу указать, что в интернете много описаний на этот счет, но примеры без каких либо комментариев и разобраться просто невозможно. |
|
Вернуться к началу |
|
|
Those haven't a nick
Зарегистрирован: 16.05.2007 Сообщения: 2
|
Добавлено: Ср Май 16 2007 21:50 Заголовок сообщения: |
|
|
Естественно, "сожноли" надо читать как "можно ли". |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Ср Май 16 2007 22:03 Заголовок сообщения: |
|
|
Ответ раз: Сожно!
На самом деле, в списке языков в свойствах проекта нет такого варианта. Но выход есть. Язык можно указать не только в виде текста, но и с помощью кода (на манер 16-ричной записи в Дельфи - знак '$' и 4-значный хекс-код). "Независимо от языка" имеет код $007F, но когда фокус уходит от комбобокса с языками, код заменяется на текстовое представление. Билдер не знает, что такое $007F, поэтому не разрешит нажать ОК, пока не введешь подходящий язык. Но обмануть его все же можно. Сначала надо указать все остальные опции (иконка приложения, заголовок, поля ProductName, CompanyName и пр.) потом вводишь код языка в комбобокс. И, не уводя фокус с комбобокса, жмешь Enter (не кнопень ОК, а ИМЕННО Enter). Единсвенный баг в том, что если ты захочешь изменить сведения о версии программы, тебе придется заполнять все поля заново, в том числе и поле "Язык" способом, описанным выше.
Дерзай! |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Ср Май 16 2007 22:44 Заголовок сообщения: |
|
|
И ответ два.
На самом деле, такой вопрос задают здесь настолько часто, что пора ввести новый форум на эту тему.
Смотри следующие хэлпы: FindWindow(), SendMessage() или SendMessageCallback() и метод главной формы приложения Dispatch() или макрокоманды BEGIN_MESSAGE_MAP, END_MESSAGE_MAP. |
|
Вернуться к началу |
|
|
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Чт Май 17 2007 19:29 Заголовок сообщения: |
|
|
Ко второму вопросу. Написал вам функцию, пользуйтесь.
Код: |
#include <windows.h>
#include <forms.hpp>
#include <sysutils.hpp>
bool RegisterSingleProcess(const long Unique) {
SetLastError(0);
SetWindowLong(Application->Handle, GWL_USERDATA, Unique);
if (GetLastError()) throw Exception("Ошибка.");
if (!Unique) return true;
void *vdHandle = FindWindow("TApplication", 0);
if (GetLastError()) throw Exception("Ошибка.");
while (vdHandle) {
if (Application->Handle != vdHandle) {
if (GetWindowLong(vdHandle, GWL_USERDATA) == Unique) return false;
if (GetLastError()) throw Exception("Ошибка.");}
vdHandle = FindWindowEx(0, vdHandle, "TApplication", 0);
if (GetLastError()) throw Exception("Ошибка.");}
return true;}
|
В WinMain пишите:
Код: |
Application->Initialize();
if (!RegisterSingleProcess(12345)) {
Application->ShowMainForm = false;
Application->Terminate();}
Application->CreateForm(/* ... */);
Application->Run();
|
Чтобы использовать функцию в еще каком-нить проекте, измените параметр на любое другое число, отличное от ноля.
Если хотите после вызова функции при каких-то обстоятельствах разрешить запуск копии приложения, вызовите функцию еще раз с аргументом 0 (в данном случае функция всегда вернет true.
Сам код не оптимален, и есть вероятность того, что функция примет за копию приложения совершенно другую программу (такая вероятность на вскидку примерно 1 к 4,000,000), но для средних нужд вполне подойдет. |
|
Вернуться к началу |
|
|
|