Всем привет.
Столкнулся вот с такой проблемой.
Есть два 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;
}
выводятся нули...
Вроде все указал...
Причина редактирования: используй кнопку КОД