Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Взаимодействие двух приложений на Qt через dll.
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
Duker
Всем привет.
Столкнулся вот с такой проблемой.

Есть два 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
Ох, :blink:
Ничего у вас не получится, почитайте для чего нужны длл-ки!
В вашем случае используйте, к примеру, QLocalServer/QLocalSocket...
Аналогичная тема была тут: http://www.prog.org.ru/topic_17997_0.html
DIMEDROLL
Duker, dll существуют совсем не для этих целей.
То что вам нужно называется Inter Process Communication (IPC) - межпроцессное взаимодействие и гуглить надо по этому термину. Самый простой вариант IPC это использование файлов, одна программа пишет в файл, другая читает. То же, но с использованием ОЗУ вместо жесткого диска называется Shared Memory, еще есть сетевое взаимодействие через сокеты (как указано выше), а так же Pipes и т.п....
msdn
Litkevich Yuriy
http://doc.crossplatform.ru/qt/4.7.x/ipc.html
Duker
Вообщем получись сделать задуманное при помощи 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.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2019 IPS, Inc.