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;
    }
выводятся нули...

Вроде все указал...
Причина редактирования: используй кнопку КОД
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 12.12.2019, 6:55