Russian Qt Forum

Qt => Общие вопросы => Тема начата: merke от Март 05, 2012, 16:24



Название: Написание dll на Qt для VB6
Отправлено: merke от Март 05, 2012, 16:24
Всем привет.

Встала необходимость написать маленькую библиотечку на Qt для VB6. её задачи это получить имя приложения, и найти его в процессах, и вернуть булевое значение. с возвращением значения всё тип-топ. но вот не получается передать в экспортируемую функцию строковое значение из VB6. ниже привожу код.

Пожалуйста, кто сможет помогите!

VB----

Код
Visual Basic
Private Declare Function retClass Lib "lib_for_vb_2" (ByVal x As String) As Boolean
 
Private Sub Form_Click()
 Dim str As Boolean
 Dim str1 As Variant
 str1 = "notepad.exe"
 str = retClass(str1)
 Print str
End Sub

Qt----

Код
C++ (Qt)
extern "C" bool retClass(char * c)
{
   QString processName = c;
 
   QFile file("C:\\test.txt");
   if (file.exists ())
       file.remove ();
 
   file.open (QIODevice::WriteOnly);
 
   QTextStream stream(&file);
   stream << processName;
 
   file.flush ();
   file.close ();
 
 
   systemWin32 processesInWin;
 
 
   if (processesInWin.findProcess(processName))
   {
       return true;
   }
   else
   {
       return false;
   }
}


Название: Re: Написание dll на Qt для VB6
Отправлено: Странник от Март 05, 2012, 17:36
String - строка символов в Юникоде, что-то вроде QChar*. а ваша функция char* принимает и запихивает ее в QString в ASCII-представлении. впрочем, я сегодня не спал, мне верить нельзя.


Название: Re: Написание dll на Qt для VB6
Отправлено: merke от Март 05, 2012, 17:42
В том то и дело, что не могу угадать какой тип прописать вот здесь
Код:
extern "C" bool retClass(char * c)
чтобы он нормально принял VB String


Название: Re: Написание dll на Qt для VB6
Отправлено: merke от Март 05, 2012, 19:48
Всё равно ни чего не понятно(((


Название: Re: Написание dll на Qt для VB6
Отправлено: merke от Март 05, 2012, 20:35
Ошибка в VB BAD DLL CALLING CONVENTION (


Название: Re: Написание dll на Qt для VB6
Отправлено: merke от Март 05, 2012, 20:48
спасибо большое за помощь. теперь следующая ошибка в VB вылетает can't find DLL entry point someFunc in test_lib


Название: Re: Написание dll на Qt для VB6
Отправлено: merke от Март 05, 2012, 21:01
Добавил вот это:

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

и заработало. теперь Qt получает крякозяблики блин(


Название: Re: Написание dll на Qt для VB6
Отправлено: Странник от Март 05, 2012, 22:22
Цитировать
it is actually passing a pointer to a pointer to a string
какбэ намекаэ


Название: Re: Написание dll на Qt для VB6
Отправлено: merke от Март 06, 2012, 09:18
В общем всё получилось. Теперь отписываюсь. Авось кому нибудь пригодится.

Проект VB:

Код
Visual Basic
Private Declare Function findProcess Lib "lib_for_vb_2" (ByVal x As String) As Boolean
 
Private Sub Form_Click()
 Dim a As String
 a = "notepad.exe"
 Print findProcess(a)
End Sub

Проект Qt:

main.cpp

Код
C++ (Qt)
#include <QtCore/QCoreApplication>
#include <QString>
#include "systemwin32.h"
#include <QFile>
#include <QTextStream>
 
#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif
 
extern "C" __stdcall bool findProcess(char * S)
{
   QString processName(S);
 
   systemWin32 processesInWin;
 
   if (processesInWin.findProcess(processName))
   {
       return true;
   }
   else
   {
       return false;
   }
}

.pro файл

Код
C++ (Qt)
TEMPLATE = lib
 
CONFIG += dll
 
TARGET = lib_for_vb_2
 
SOURCES += main.cpp
 
DEF_FILE = $$PWD/lib_for_vb_2.def
 
OTHER_FILES += \
   lib_for_vb_2.def

И самое главное def. файл:

Код
C++ (Qt)
LIBRARY   lib_for_vb_2
EXPORTS
findProcess     @1
convertToUtf8   @2

Теперь пытаюсь сделать следующее: вернуть из библиотеки не булеан значение, а к примеру тот же String. но пока ни чего не получилось.

Код
C++ (Qt)
extern "C" __stdcall wchar_t * convertToUtf8(char * S)
{
   QString string(S);
 
   QString strEnd = string.toUtf8 ();
 
   wchar_t *sss;
 
   strEnd.toWCharArray (sss);
 
   return sss;
}

Код
Visual Basic
Private Declare Function convertToUtf8 Lib "lib_for_vb_2" (ByRef x As String) As String
 
Private Sub Command1_Click()
 Print convertToUtf8("sasha")
End Sub

Приложение на VB просто напросто вылетает...

Всем огромное СПАСИБО за оказанную помощь!!!


Название: Re: Написание dll на Qt для VB6
Отправлено: merke от Март 06, 2012, 11:17
Компилятор ругается release/main.o:main.cpp:(.text+0x2f): undefined reference to `SysAllocString@4'


Название: Re: Написание dll на Qt для VB6
Отправлено: merke от Март 06, 2012, 11:29
Во! Спасибо! только теперь в VB возвращается только первый символ( из всего набора, которые я передаю в библиотеку


Название: Re: Написание dll на Qt для VB6
Отправлено: merke от Март 06, 2012, 11:34
Вывел просто на форму функций Print и увидел что пришли все символы, но в компоненты когда выводишь, отображается только один символ. Видно не в той кодировке возвращается, получается какое то двухбайтовое представление


Название: Re: Написание dll на Qt для VB6
Отправлено: merke от Март 06, 2012, 11:45
Да, теперь получается мне вернулось в UTF16 а мне нужно UTF8


Название: Re: Написание dll на Qt для VB6
Отправлено: merke от Март 06, 2012, 11:46
Каждый символ два байта( а мне этого не нужно)


Название: Re: Написание dll на Qt для VB6
Отправлено: merke от Март 06, 2012, 12:41
тоже самое, уже пробовал)


Название: Re: Написание dll на Qt для VB6
Отправлено: merke от Март 06, 2012, 15:21
В голову не укладывается, что может быть в VB не так:

VB

Код
Visual Basic
Private Declare Function convertToUtf8 Lib "lib_for_vb_2" (ByRef x As String) As String
 
Private Sub Command1_Click()
 MsgBox convertToUtf8("александр")
End Sub
 

Qt:

Код
C++ (Qt)
extern "C" __stdcall wchar_t * convertToUtf8(char** S)
{
   QString string(*S);
   return SysAllocStringLen((OLECHAR FAR*)string.utf16 (), string.length());
}

В месагбокс выводится только первый символ ("А").


Название: Re: Написание dll на Qt для VB6
Отправлено: merke от Март 06, 2012, 17:10
Уже интереснее. выводится всё ок, только в конце приписываются непонятные символы