Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Два вопроса по C++Builder

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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    Заголовок сообщения: Ответить с цитатой

Естественно, "сожноли" надо читать как "можно ли". Laughing
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Ср Май 16 2007 22:03    Заголовок сообщения: Ответить с цитатой

Ответ раз: Сожно! Wink
На самом деле, в списке языков в свойствах проекта нет такого варианта. Но выход есть. Язык можно указать не только в виде текста, но и с помощью кода (на манер 16-ричной записи в Дельфи - знак '$' и 4-значный хекс-код). "Независимо от языка" имеет код $007F, но когда фокус уходит от комбобокса с языками, код заменяется на текстовое представление. Билдер не знает, что такое $007F, поэтому не разрешит нажать ОК, пока не введешь подходящий язык. Но обмануть его все же можно. Сначала надо указать все остальные опции (иконка приложения, заголовок, поля ProductName, CompanyName и пр.) потом вводишь код языка в комбобокс. И, не уводя фокус с комбобокса, жмешь Enter (не кнопень ОК, а ИМЕННО Enter). Единсвенный баг в том, что если ты захочешь изменить сведения о версии программы, тебе придется заполнять все поля заново, в том числе и поле "Язык" способом, описанным выше.
Дерзай! Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
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), но для средних нужд вполне подойдет.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...