Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание dll с соглашением вызова stdcall 
:(
    Опции темы
becks
Дата 24.5.2013, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Добрый день!

Необходимо создать dll на Qt с соглашением вызова stdcall, и не как иначе, поскольку подключаться будет к проекту на билдере, а тот утроен так, что ест только dll с соглашением вызова stdcall.

Есть про файл:
Код

QT       -= gui

TARGET = kmn
TEMPLATE = lib

#QMAKE_CFLAGS += /Gz
#QMAKE_CXXFLAGS += /Gz

SOURCES += \
    kmn_loader.cpp \
    DLLRobotRun.cpp

HEADERS += \
    kmn_loader.h \
    DLLRobotRun.h


Есть объявления функций DLLRobotRun.h:

Код

#if defined(DLLROBOT_DLL)
    #define _DLLROBOTFUNC extern "C" _export  __stdcall
#else
    #define _DLLROBOTFUNC extern "C" _import __stdcall
#endif

.....


_DLLROBOTFUNC const char* GetRobotDLLName();

_DLLROBOTFUNC int DLLInit(WORKParams *wpar);



Есть их определение:

Код

#define DLLROBOT_DLL

#include "DLLRobotRun.h"

_DLLROBOTFUNC const char * GetRobotDLLName()
{
  return "ROBOTTEST.DLL";
}

_DLLROBOTFUNC int DLLInit(WORKParams *wpar)
{
   return 1;
}


Проект не собирается. Компилятор ругается на _export. Плюс прочитал на форумах, чтоб использовать __stdcall, необходимо поставить флаги: 

#QMAKE_CFLAGS += /Gz
#QMAKE_CXXFLAGS += /Gz

Поставил, ругается на /Gz и не знает QMAKE_CFLAGS.

Вот как-то так.
Qt Creator, MinGW, Qt 4.8.4

PM MAIL   Вверх
Avazart
Дата 24.5.2013, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 6.4.2013

Репутация: нет
Всего: нет



Цитата

поскольку подключаться будет к проекту на билдере, а тот утроен так, что ест только dll с соглашением вызова stdcall.

Не надо ля-ля...
Нормально и другие соглашения работают, просто писать надо правильно.

Главное использовать extern  "C", а в ф-циях указывать только простые типы.

Это сообщение отредактировал(а) Avazart - 24.5.2013, 19:18
PM MAIL   Вверх
borisbn
Дата 25.5.2013, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Из дефайна _DLLROBOTFUNC убираешь __stdcall, а в объявления ф-ций добавляешь
Цитата
_DLLROBOTFUNC const char* __stdcall GetRobotDLLName()
;


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
becks
Дата 25.5.2013, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Цитата

Не надо ля-ля...


Вы меня не правильно поняли. Эта программа на Билдере, она является универсальным "запускатором" dll. Есть строго заданный набор функций, которые должна импортировать каждая из библиотек. Т.е. условно говоря есть общий интерфейс для все библиотек. И соглашение там только stdcall.


borisbn, большое спасибо за ответ. В понедельник на работе попробую.
PM MAIL   Вверх
Avazart
Дата 26.5.2013, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 6.4.2013

Репутация: нет
Всего: нет



Цитата

Компилятор ругается на _export. 

Вероятно его нет в Qt.

Пробуй 
Код

__declspec(dllexport)

Ну и можетт поменть местами его надо с __stdcall


Это сообщение отредактировал(а) Avazart - 26.5.2013, 22:18
PM MAIL   Вверх
becks
Дата 27.5.2013, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Цитата(Avazart @  26.5.2013,  22:16 Найти цитируемый пост)
__declspec(dllexport)


Это ж MSVC, если я правильно понимаю, он то тут причем?

Собственно, если оставить вот так:

Код

#if defined(DLLROBOT_DLL)
    #define _DLLROBOTFUNC extern "C"  __stdcall __declspec(dllexport)
#else
    #define _DLLROBOTFUNC extern "C"  __stdcall  __declspec(dllimport)
#endif


то dll-ка собирается, но функции имеют вид DLLConnect@8, DLLInit@4 и т.д.
Вот есть хорошая статейка по соглашениям http://www.willus.com/mingw/yongweiwu_stdcall.html

Вопрос все еще открыт, к сожалению, никак не получается.
PM MAIL   Вверх
Avazart
Дата 1.6.2013, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 6.4.2013

Репутация: нет
Всего: нет



Как вариант написать "прокси" DLL на С++Builder.

Это сообщение отредактировал(а) Avazart - 1.6.2013, 23:23
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0677 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.