Как запустить проект c на другом компьютере

Обновлено: 04.07.2024

Одно из самых известных приложений по удаленному управлению компьютером - TeamViewer. Займемся разработкой своего упрощенного аналога подобной клиент-серверной системы на C++ с использованием Qt. В этот раз решим подготовительные задачи по анализу и планированию того, что у нас должно получиться.

Удаленное управление в разрезе

Удаленное управление в стиле TeamViewer можно разбить на две части: серверную и клиентскую. Серверной стороной оказывается та, которой управляют. Клиент же занимается управлением.

Для серверной части основными являются следующие функции:

  1. Захват экрана и событий мыши;
  2. Трансляция по сети видео-потока для графического отображения событий, происходящих на экране;
  3. Воспроизведение полученных от удаленного клиента действий по перемещению/щелчкам мыши и нажатию клавиш клавиатуры.

Клиентской части характерны такие функции:

  1. Прием и воспроизведение видео-потока от удаленного источника (сервера) с визуальным представлением происходящего на экране;
  2. Передача на удаленный сервер событий мыши и клавиатуры по сети.

Схематично это можно представить следующим образом:

remote-control-client-server-thumbnail

Реклама

Какие модули нам понадобятся

Нам известен необходимый функционал. Распределим его по логическим модулям, которые нам потребуется разработать:

  1. InputRecorder - модуль записи видео-потока экрана, событий мыши и клавиатуры. Он нам понадобится как на клиентской, так и на серверной стороне;
  2. InputPlayer - модуль воспроизведения событий мыши и клавиатуры. Нужен на серверной стороне;
  3. RemoteControlServer - сервер удаленного управления;
  4. RemoteControlClient - клиент удаленного управления.

Возможно, нам понадобятся и другие вспомогательные библиотеки, но эта архитектура уже способна удовлетворить ключевые потребности.

Реклама

Выводы

Мы готовы начать разработку. Но хочу предупредить, что, полноценный TeamViewer у нас все же не получится. Мы заведомо игнорируем многие важные вопросы. Например, безопасность, чтобы не усложнять реализацию шифрованием. Так же на практике могут возникнуть проблемы из области оптимизации передачи данных по сети (в первую очередь для видео-потока). Все это не входит в наши цели, поэтому мы закрываем глаза на подобные сложности. Но даже то, что остается, уже можно считать полноценным приложением, при разработке которого мы решим много интересных задач.

Аннотация

Требования

В этой статье предполагается, что вы знакомы со следующими разделами:

Создание объекта удаленного сервера

Первым шагом в создании приложения-сервера является создание объекта сервера. Объект сервера — это то, с чем клиентские приложения мгновенно взаимодействуют и взаимодействуют на серверном компьютере. Клиентская заявка делает это с помощью прокси-объекта, созданного на клиенте. В этом примере объект сервера находится в библиотеке класса (DLL) и называется myRemoteClass.

В Обозревателе решений переименуем файл кода Class1.cs в ServerClass.cs.

Откройте ServerClass.cs и переименуйте class1 в myRemoteClass. Также необходимо переименовать конструктор по умолчанию для класса таким образом, чтобы он совпадал с именем класса. myRemoteClass должен наследовать от MarshalByRefObject класса. Теперь класс должен отображаться следующим образом:

Создайте проект для создания ServerClass.dll сборки.

Сохранить и закрыть проект.

Создание приложения удаленного сервера

После создания объекта сервера, с который клиент будет общаться, необходимо зарегистрировать этот объект в рамках Remoting. При регистрации объекта необходимо также запустить сервер и подключить сервер к порту для подключения к порту. Для этого необходим тип проекта, который выводит исполняемый файл.

Причина, по которой объект сервера включен в отдельный проект, заключается в том, что вы можете легко ссылаться на объект сервера из клиентского проекта. Если вы включаете его в этот проект, вы не можете ссылаться на него, так как ссылки могут быть заданной только для DLL-файлов.

В Обозревателе решений переименуем файл Class1.cs в RemoteServer.cs.

Добавьте ссылку на сборку ServerClass.dll, созданную в предыдущем разделе.

Объявить соответствующую переменную. Объявить и инициализировать объект, который прослушивает подключение клиентов в определенном порту, который является TcpChannel портом 8085 в этом примере. Используйте метод RegisterChannel для регистрации канала службами канала. Добавьте следующий код объявления в Main Class1 процедуру:

Вызов метода объекта для регистрации объекта с помощью фреймворка Remoting и укажите RegisterWellKnownType RemotingConfiguration следующие ServerClass параметры:

Назови конечную точку, где объект должен быть опубликован как RemoteTest. Клиенты должны знать это имя, чтобы подключиться к объекту.

Используйте режим SingleCall объекта, чтобы указать конечный параметр. Режим объекта указывает срок службы объекта при его активации на сервере. В случае объектов создается новый экземпляр класса для каждого вызова, который совершает клиент, даже если один и тот же клиент вызывает один и тот же SingleCall метод несколько раз. С другой стороны, Singleton объекты создаются только один раз, и все клиенты взаимодействуют с тем же объектом.

Используйте метод ReadLine объекта Console для поддержания работы серверного приложения.

Выполните построение проекта.

Сохранить и закрыть проект.

Ссылки

Это моя строка подключения:

SQL Server предназначен для серверных баз данных. Вы можете изменить свой проект на использование SQL Server CE (SQL Server Compact Edition), который является однофайловой локальной базой данных. Он очень похож на «настоящий» SQL Server, поэтому может быть самым простым решением. Ваш код, вероятно, не изменится, кроме строки подключения.

Если ваша строка подключения такая, как показано ниже

Тогда вам следует установить sql localdb 2012.msi на компьютер вашего друга. И убедитесь, что файл .mdf расположен так же, как и на вашем компьютере.

Используйте IP-адрес вашего локального компьютера, на котором находится база данных; 1433 - это номер порта по умолчанию. Затем измените строку подключения соответствующим образом:

Если вы хотите запустить свою программу без установленного SQL-сервера, вам необходимо использовать базу данных sql на основе служб. см. это изображение

Вы можете добавить локальную базу данных через Visual Studio (проект -> Добавить новый элемент)

При первом открытии порта 1433 в брандмауэре, если он вам не нужен, вы можете отключить брандмауэр. перейдите в Run = & gt; cmd = & gt; Ipconfig, чтобы узнать активность сетевой карты. Показать как

Например, мой компьютер имеет только беспроводную связь, а мой адрес в частной локальной сети: 192.168.100.165 И теперь вы меняете строку подключения в web.config.

И если вы хотите подключить базу данных из Интернета, вам нужно открыть порт вашего маршрутизатора

Мое решение подойдет, если вам нужна база данных SQL на компьютере вашего друга, а не хостинг на вашем собственном.

Самый дешевый способ обрабатывать базу данных локально на любом устройстве с использованием подходящей базы данных - это преобразовать в SQLite. Это более легкая альтернатива локальному устройству, которая вообще не требует от пользователя установки SQL-сервера.

Существуют также альтернативы, такие как запись информации в скрытый файл (обычно в двоичном формате, если вы не хотите, чтобы ваше приложение было взломано).

Короче говоря, рассматривайте базу данных SQL только в том случае, если вы размещаете базу данных, в противном случае используйте альтернативы.

Репутация: 27
Всего: 154

user posted image

Я решил раз и навсегда пролить свет на эту тему. так как уже достали =)
Что делать если программа написаная с использованием visual studio 2005 не запускается на другом компьютере.
Во первых, следует пояснить, что (почти)любая программа на с++ использует стандартную библиотеку - c runtime library, которая содержит набор функций, используемых программой. Например функции для работы с динамической памятью, со строками, с файлами и много чего еще. Эта библиотека может компоноваться либо динасически, либо статически. Так-же существует release и debug версии библиотеки. По умолчанию, когда вы создаете проект в visual studio, он настроен на использование динамической библиотеки. Поэтому, приложение можно будет запустить только на компьютерах, с установленной CRT библиотекой нужной версии.
Самый очевидный способ решения поблемы - уствновить вместе с приложением нужные библиотеки. Для этого существует Microsoft Visual C++ 2005 Redistributable Package (x86/IA64). Этот пакет устанавливает стандартную библиотеку с++ (MSVCR80.dll) а так-же ATL, MFC и OpenMP библиотеки. После этого ваше приложение можно запускать на этой машине.
Чуть менее очевидный способ - статическая компоновка. Заходим в опции проекта, находим там опции компилятора (C/C++ -> Code Generation), и меняем параметр Runtime Library с "Multi Threaded DLL (/MD)" на "Multi Threaded (/MT)". Для отладочной версии программы нужно поменять "Multi Threaded Debug DLL (/MDd)", на "Multi Threaded Debug (/MTd)". После перекомпиляции, несем программу на любую машину и запускаем.

Репутация: 6
Всего: 162

Следует заметить, что Visual Studio - не единственная среда разработки
А так - спасибо за старания.

Репутация: 27
Всего: 154

Репутация: 85
Всего: 196

Есть еще универсальный способ (которым пользуюсь я), который подходит и к другим средам программирования (в т.ч. BCB, Delphi и пр.). Для этого понадобится какая-нибудь программа для просмотра содержимого бинарных файлов. Я использую вьюер входящий в состав Total Commander.
Итак, открываем полученный файл exe с помощью вьюера, и ищем по ".DLL" (без кавычек и учета регистра) или другому расширению (например, ".BPL" для BCB), в зависимости от того, на что ругается программа. Будут находиться всякие библиотеки, в т.ч. и стандартные (kernel32.dll, user32.dll и пр.) и не очень. Последние нужно скопировать в дистрибутив. затем ту же операцию повторить для всех библиотек. и так до тех пор, пока не будут найдены все зависимости.

Репутация: 27
Всего: 154

bsa, действительно так можно делать, а я и не знал

Репутация: нет
Всего: 15


А я depends (Dependency Walker). Не знаю, как в Total Commander, а здесь такого рода ошибки выдаются наглядно.

Репутация: нет
Всего: 52

Модераторы, думаю эту тему стоит закрепить отдельно?

Ни что не внушает сна крепче, чем день приисполненный трудов!

Репутация: 6
Всего: 162

Репутация: нет
Всего: нет

Для 2008 студии только установка Microsoft Visual C++ 2008 Redistributable Package (x86/IA64)?Или есть альтернатива?

Репутация: 27
Всего: 154

Репутация: нет
Всего: нет

Цитата

Заходим в опции проекта, находим там опции компилятора (C/C++ -> Code Generation), и меняем параметр Runtime Library с "Multi Threaded DLL (/MD)" на "Multi Threaded (/MT)".

При компиляции выдаёт:

( * У меня Microsoft Visual Studio 2008)

Репутация: 6
Всего: 118

кроме depends (входящей в состав VS) есть утилита dumpbin
использовать ее примерно так:

покажет импортные библиотеки и функции (хотя не умеет делать глубокого сканирования, как, например, depends)
Что-то не поняли? -> Напейтесь до зеленых человечков. эта сверхцивилизация Вам поможет.

Репутация: 1
Всего: 3

Цитата

Заходим в опции проекта, находим там опции компилятора (C/C++ -> Code Generation), и меняем параметр Runtime Library с "Multi Threaded DLL (/MD)" на "Multi Threaded (/MT)".

При компиляции выдаёт:

Балмер! Я узнал тебя

Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо

Репутация: нет
Всего: нет

Репутация: 85
Всего: 196

skylex, легко - зайти в настройки проекта и удали все run-time packages, а в настройках линкера включи линковку со статическими библиотеками (кажется, static RTL, или что-то в этом духе).
Модератор: для вопросов по билдеру есть свой раздел.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

[ Время генерации скрипта: 0.1484 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Я создал клиентское серверное приложение на C++ с помощью Visual Studio.

Как я могу запустить EXE-файл ничего не устанавливая на компьютер?

приложения, построенные с помощью Visual Studio, зависят от Visual C++ Redistibutable (VCRedist). Когда программа связана динамически, то ваши двоичные файлы будут нуждаться MSVCR**.dll (Библиотека Времени Выполнения Microsoft C).

в MSDN есть хорошая статья под названием распространение файлов Visual C++ (для Visual Studio 2008), который утверждает, что есть потенциальные ошибки во время выполнения на случай, если это не требуется библиотека Visual C++ установлено:

  • приложение не удалось правильно инициализировать (0xc0000135).
  • это приложение не удалось запустить из-за неправильной конфигурации приложения. Переустановка приложения может устранить эту проблему.
  • система не может выполнить указанную программу.
  • самым простым решением является изменение динамической компоновки библиотек времени выполнения на статическую компоновку. Зайти в свойства проекта и в разделе C / C++ > Генерация Кода вы найдете Библиотека Времени Выполнения. Вам нужно изменить его с Multi-threaded DLL (/MD) to Multi-threaded (/MT) .
  • другое возможное решение-сделать убедитесь, что на целевой машине установлена правильная версия распространяемого пакета Microsoft VC++.

но ваше приложение может зависеть и от других библиотек DLL. Если вы хотите узнать, каковы зависимости вашей программы, есть отличная утилита под названием Зависимость Walker, которые помогут вам в этой и многих других ситуациях :)

Справочная информация:

  • приложениям C++ необходимы сборки времени выполнения (DLL) для работы на любом компьютере windows.
  • обычно эти сборки времени выполнения расположены на C:\Windows\Winsxs справочник.
  • все операционные системы windows по умолчанию поставляются с несколькими сборками времени выполнения.
  • но если ваше приложение разработано в более новой версии среды сборки во время выполнения, целевой компьютер также нуждается в той же версии времени выполнения существовать там.
  • при установке visual studio на компьютер поступает большинство новых версий сборок времени выполнения.

Soloution: Наконец, в любом случае целевой компьютер должен иметь точные сборки времени выполнения. Есть несколько способов сделать это (для более подробного поиска в google каждый).

  1. статически связать сборки времени выполнения с вашим приложением (хлопотно для большого приложения).
  2. установить перераспределение C++ среда в целевом компьютере (самый простой способ).
  3. создание проекта установки для развертывания во время выполнения на целевом компьютере при установке приложения. (Неплохо)
  4. развертывание сборок времени выполнения в качестве частных сборок (professional) см. здесь для более подробной информации

условия:

Я не видел эту конкретную ошибку раньше, обычно это ошибка вокруг отсутствующей DLL (Windows redistributable). Предполагая, что на самом деле нет проблем с конфигурацией, у вас есть два варианта:

1) измените режим компиляции с многопоточного DLL на многопоточный. Это можно сделать из раздела c++ свойств проекта в разделе генерация кода. В многопоточном режиме ваш двоичный файл будет статически связан с распространяемым Windows. Это, вероятно, что ты хочешь.

2) Установите распространяемый windows на целевой машине. Это, вероятно, не нормально b / c вы заявляете, что не хотите ничего устанавливать на целевой машине.

предупреждение о опции 1, разные версии windows имеют разные версии распространяемого. Можно столкнуться с узкоспециализированной средой, в которой статически связанная программа будет вести себя не так, как ожидалось.

я развернул свою программу в выпуске вместо отладки, и exe теперь работает на другом компьютере

Похоже, вам не хватает некоторых DLL-файлов. Обязательно скопируйте соответствующие dll вместе с exe.

Читайте также: