Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача данных из приложения C++Builder во внешнюю программу  (Прочитано 21320 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Toxa58
Интересующийся

by
Offline Offline

« : 17-05-2015 11:23 » 

Уважаемые программисты!
Подскажите, пожалуйста, как осуществляется передача данных из С++Builder 6.0 во внешнюю программу? Эта программа-приемник написана не мной. Что я должен знать об указанной программе и с чего начинать вообще?
Записан
zubr
Гость
« Ответ #1 : 17-05-2015 11:47 » 

Ну наверно с системных возможностей Windows, и C++, а тем более Builder 6.0 тут вообще не причем.
Данные из программы в программу могут передаваться несколькими способами: через файл, расшаренную память, посредством сообщений.

З.Ы. Какая то активизация "куллхацкеров" Улыбаюсь
Записан
Toxa58
Интересующийся

by
Offline Offline

« Ответ #2 : 17-05-2015 12:53 » 

Если данные у меня представляют строку, в которой может содержаться около тысячи символов, то какой из предложенных "zubr"-ом способов подходит больше?
Записан
zubr
Гость
« Ответ #3 : 17-05-2015 13:06 » 

Любой, на усмотрение автора программы.
Записан
Toxa58
Интересующийся

by
Offline Offline

« Ответ #4 : 17-05-2015 13:28 » 

Еще вопрос (может не самый умный) о способах. В случае переноса exe проекта на другой компьютер (с одинаковой ОС или ее разными версиями), передача данных будет осуществляться без дополнительных вмешательств (настройки и т.д.)?
Записан
zubr
Гость
« Ответ #5 : 17-05-2015 14:35 » 

Ну это опять таки зависит от автора разработки. Тут как "Есть ли жизнь на Марсе, нет ли жизни на Марсе, науке это не известно" (C). Можно организовать взаимодействие между программами, работающее на какой то линейке систем, не требующее настроек, можно с настройками (к примеру путь к файлу данных), которые прописываются, к примеру в файл или реестр.
Записан
Toxa58
Интересующийся

by
Offline Offline

« Ответ #6 : 21-05-2015 13:19 » 

Нашел возможность связать приложение с программой через Dll. Для этого скачал .lib-файл для DLL и саму .dll. Как лучше связать статически или динамически? А лучше поясните пожалуйста куда и что прописать в BCB?
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #7 : 21-05-2015 15:02 » 

У Вас *.lib файл и *.dll файл какими компиляторами созданы? Если Visual C++, то по крайней мере, раньше с этим были проблемы. Судя по этому - проблемы никуда не делись. Эти фалы *.lib и *dll от разработчика этой программы, которой Вы хотите передать строку на тысячу символов? Если не секрет, что это за программа?
« Последнее редактирование: 21-05-2015 15:04 от darkelf » Записан
Toxa58
Интересующийся

by
Offline Offline

« Ответ #8 : 21-05-2015 15:22 » 

Эта программа LPSolve IDE 5.5. Солвер для решения задач целочисленного линейного программирования.
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #9 : 21-05-2015 15:42 » 

Если я правильно понял, то Вам не нужно *.lib/*.dll для общения с этой программой. Имеется программа командной строки lp_solve (см. справку на "lp_solve command"), которая принимает входные файлы (*.mps, *.lp) и умеет выдавать результат. Разучите её ключи и форматы входных файлов и всё у Вас должно будет получиться.
Записан
Toxa58
Интересующийся

by
Offline Offline

« Ответ #10 : 21-05-2015 15:48 » 

darkelf, поясните, пожалуйста, что такое ключи. Формат входных файлов *.lp я знаю. Указанный формат я организую с помощью sql-запросов из базы данных. А вот как передать необходимые данные сооброзить никак не могу, сказыаются слабые знания программирования.
 
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #11 : 21-05-2015 15:59 » 

запустите cmd.exe (Win+R cmd.exe <enter>), в командной строке перейдите в каталог, куда установлен lp_solve. В текстовом редакторе заготовьте файл для lp_solve (это для теста, дальше Вы сможете его подготавливать в своей программе на Borland C++ Builder 6.0, при помощи "sql-запросов из базы данных", что-бы это ни значило), например test.lp и сохраните его в каталоге, куда установлена lp_solve. Далее запустите программу lp_solve введя в окне cmd.exe:
Код:
lp_solve test.lp
Если всё получилось, и программа что-то Вам рассчитала, Вы можете поискать, имеется-ли функция popen() в Borland C++ Builder 6.0, и попробовать формировать файл задания test.lp программно, далее, при помощи popen() запускать программу lp_solve на обработку и читать её вывод функциями fgets().

Если, вдруг, функция popen() отсутствует, то можно организовать вызов программы lp_solve другими способами, начиная со  spawn(), CreateProcess() и заканчивая ShellExecute(), просто надо будет обеспечить перенаправление вывода программы в какой-то файл, который потом читать из своей программы.
« Последнее редактирование: 21-05-2015 16:17 от darkelf » Записан
Toxa58
Интересующийся

by
Offline Offline

« Ответ #12 : 21-05-2015 16:25 » 

Спасибо darkelf! Остаются вопросы: как программно указать ключ и будет ли он работать при переносе проекта на другой комп?

Добавлено через 1 минуту:
darkelf, извините. Не дочитал вторую часть сообщения!
« Последнее редактирование: 21-05-2015 16:26 от Toxa58 » Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #13 : 22-05-2015 05:39 » new

Спасибо darkelf! Остаются вопросы: как программно указать ключ и будет ли он работать при переносе проекта на другой комп?

Добавлено через 1 минуту:
darkelf, извините. Не дочитал вторую часть сообщения!

Toxa58, Вы, видимо, не совсем поняли, что значит слово "ключ" в данном контексте. Ключ - это параметр, передаваемый программе в командной строке, который программа анализирует при запуске и который модифицирует поведение программы. Например, если Вы запустите lp_solve test.lp, программа lp_solve начнёт обработку Вашего файла test.lp, но если Вы скажете lp_solve -h - она, проанализировав, что ей передан параметр "-h" выдаст справку о своём использовании, какие ключи она поддерживает и что они значат.

Касательно запуска на другом компьютере - в данном случае тот подход, который был предложен раньше, не подойдёт. В данном случае, можно будет попробовать использовать другой подход. Написать программу, например в формате службы Windows, которая будет ожидать на сокете, при получении соединения, получать по этому сокету файл задания (тот самый файл test.lp, сохранять его в определённый каталог, запускать программу lp_solve с этим файлом и перенаправлением ввода вывода в файл результата, и выдачи файла результата по сети в ответ. Для обеспечения нескольких параллельных работ, придётся использовать не фиксированные, а временно созданные имена файлов (см. функцию tmpname(), если она, конечно, есть в Borland C++ Builder). Естественно такая программа-сервер должна будет запускаться на том-же компьютере, где установлен пакет с lp_solve. В системах Unix, думаю, всё было-бы гораздо проще - там можно организовать запуск программы просто прописав её в настройках службы inetd.
« Последнее редактирование: 22-05-2015 05:41 от darkelf » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines