crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Взаимодействие двух приложений на Qt через dll.
Duker
  опции профиля:
сообщение 12.6.2011, 19:38
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 12.6.2011
Пользователь №: 2739

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем привет.
Столкнулся вот с такой проблемой.

Есть два Qt приложения KAUS и Arinc (2 exe файла) и dll файл тоже написаный на Qt (использую Qt Creator).
Все лежит в одной директории.
Суть такова использовать dll для обмена данными между приложениями. Т.е. одно приложение только записывает в переменные данные, а другое только считывает.
Вообщем dll'ка работает исправно, когда её использует только одно приложение. Т.е. использую в одном приложении функцию SetStructValuesNAV для записи данных, а затем GetStructValuesNAV для чтения. Это работает.

А если использую двумя приложениями то при чтении данных выдаются нули...
Нашел информацию в интернете что при таком использовании dll каждое приложение имеет свой экземпляр объета dll и в этом случае надо использовать dll share.

Вот пример кода что на данный момент есть.
Файлы dll'ки

Файл: Module_Navigation.pro
QT -= gui
TARGET = Module_Navigation
TEMPLATE = lib
CONFIG += shared
DEFINES += QT_BUILD_MYLIBNAME_LIB
SOURCES += module_navigation.cpp
HEADERS += module_navigation.h \
                     mysharedlib_global.h

Файл: mysharedlib_global.h
#ifndef MYSHAREDLIB_GLOBAL_H
#define MYSHAREDLIB_GLOBAL_H

#include <QtCore/QtGlobal>


#ifdef Q_OS_WIN
#   if defined( QT_BUILD_MYLIBNAME_LIB  )
#      define Q_MYLIBNAME_EXPORT __declspec(dllexport)
#   else
#      define Q_MYLIBNAME_EXPORT __declspec(dllimport)
#   endif
#else
#      define Q_MYLIBNAME_EXPORT
#endif


#endif // MYSHAREDLIB_GLOBAL_H

Файл: module_navigation.h
#ifndef MODULE_NAVIGATION_H
#define MODULE_NAVIGATION_H

#include <QString>
#include <QDir>
#include <QProcess>

#include "mysharedlib_global.h"


struct Struct_NAV
{
    double Latitute;
    double Longitude;
    double Height;
    double Kyrs;
    double Kren;
    double Tangage;
};


QProcess *myProcess;
Struct_NAV StructNAV;

extern "C"
{
    Q_MYLIBNAME_EXPORT void OpenArinc();    // Запуск программы
    Q_MYLIBNAME_EXPORT void CloseArinc();   // Завершение работы программы
    Q_MYLIBNAME_EXPORT Struct_NAV GetStructValuesNAV();
    Q_MYLIBNAME_EXPORT QString oddUpper(const QString& str);
    Q_MYLIBNAME_EXPORT void SetStructValuesNAV(double , double , double , double , double , double , double);  // Запись параметров навигации
}

#endif // MODULE_NAVIGATION_H

Файл: module_navigation.cpp
#include "module_navigation.h"

Q_MYLIBNAME_EXPORT void OpenArinc() // Запуск программы Arinc
{  
    QString program = "Arinc.exe";
    myProcess = new QProcess;
    myProcess->start(program);

    StructNAV.Latitute  = 0;
    StructNAV.Longitude = 0;
    StructNAV.Height    = 0;
    StructNAV.Kyrs      = 0;
    StructNAV.Kren      = 0;
    StructNAV.Tangage   = 0;
}

Q_MYLIBNAME_EXPORT void CloseArinc() // Завершение работы программы Arinc
{  
    myProcess->close();

    delete myProcess;
    myProcess = 0;
}

Q_MYLIBNAME_EXPORT void SetStructValuesNAV(double Latitute, double Longitude, double Height, double Kyrs, double Kren, double Tangage, double DT) // Запись параметров навигации
{
        StructNAV.Latitute  = Latitute;
        StructNAV.Longitude = Longitude;
        StructNAV.Height    = Height;
        StructNAV.Kyrs      = Kyrs;
        StructNAV.Kren      = Kren;
        StructNAV.Tangage   = Tangage;
}

Q_MYLIBNAME_EXPORT Struct_NAV GetStructValuesNAV() // Получить параметры навигации
{
    return StructNAV;
}

Q_MYLIBNAME_EXPORT QString oddUpper(const QString& str)
{
    return str;
}

Пример записи данных в dll из приложения Arinc
    typedef void (*Function)(double , double , double , double , double , double , double);
    Function SetStructValuesNAV = (Function)lib.resolve("SetStructValuesNAV");
    if (SetStructValuesNAV)
    {
        SetStructValuesNAV(111,222,333,444,555,666,777);
    }

Пример чтения данных из dll из приложения KAUS
    typedef Struct_NAV (*Function)();
    Function GetStructValuesNAV = (Function)MainWindow::lib.resolve("GetStructValuesNAV");
    if (GetStructValuesNAV)
    {
        Struct_NAV t = GetStructValuesNAV();

        qDebug() << t.Latitute;
        qDebug() << t.Longitude;
        qDebug() << t.Height;
        qDebug() << t.Kyrs;
        qDebug() << t.Kren;
        qDebug() << t.Tangage;
    }
выводятся нули...

Вроде все указал...
Причина редактирования: используй кнопку КОД
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 12.6.2011, 19:46
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


Ох, :blink:
Ничего у вас не получится, почитайте для чего нужны длл-ки!
В вашем случае используйте, к примеру, QLocalServer/QLocalSocket...
Аналогичная тема была тут: http://www.prog.org.ru/topic_17997_0.html
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 12.6.2011, 23:07
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

Спасибо сказали: 23 раз(а)




Репутация:   0  


Duker, dll существуют совсем не для этих целей.
То что вам нужно называется Inter Process Communication (IPC) - межпроцессное взаимодействие и гуглить надо по этому термину. Самый простой вариант IPC это использование файлов, одна программа пишет в файл, другая читает. То же, но с использованием ОЗУ вместо жесткого диска называется Shared Memory, еще есть сетевое взаимодействие через сокеты (как указано выше), а так же Pipes и т.п....
msdn
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.6.2011, 7:32
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


http://doc.crossplatform.ru/qt/4.7.x/ipc.html
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Duker
  опции профиля:
сообщение 13.6.2011, 19:54
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 12.6.2011
Пользователь №: 2739

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вообщем получись сделать задуманное при помощи share переменной.

Если компилятор VC то юзать надо #pragma data_seg как написано здесь ссылка

Если компилятор GCC...

Вот что нарыл из документации по GCC

shared
On Microsoft Windows, in addition to putting variable definitions in a named section, the section can also be shared among all running copies of an executable or DLL. For example, this small program defines shared data by putting it in a named section shared and marking the section shareable:

          
          int foo __attribute__((section ("shared"), shared)) = 0;
          
          int
          main()
          {
            /* Read and write foo.  All running
               copies see the same value.  */
            return 0;
          }


You may only use the shared attribute along with section attribute with a fully initialized global definition because of the way linkers work. See section attribute for more information.

The shared attribute is only available on Microsoft Windows.

Но такие возможности я так понял есть только в Windows.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.11.2024, 9:36