Russian Qt Forum
Сентябрь 30, 2024, 18:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Написание dll на Qt для VB6  (Прочитано 7182 раз)
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;
   }
}
Записан
Странник
Гость
« Ответ #1 : Март 05, 2012, 17:36 »

String - строка символов в Юникоде, что-то вроде QChar*. а ваша функция char* принимает и запихивает ее в QString в ASCII-представлении. впрочем, я сегодня не спал, мне верить нельзя.
Записан
merke
Гость
« Ответ #2 : Март 05, 2012, 17:42 »

В том то и дело, что не могу угадать какой тип прописать вот здесь
Код:
extern "C" bool retClass(char * c)
чтобы он нормально принял VB String
Записан
merke
Гость
« Ответ #3 : Март 05, 2012, 19:48 »

Всё равно ни чего не понятно(((
Записан
merke
Гость
« Ответ #4 : Март 05, 2012, 20:35 »

Ошибка в VB BAD DLL CALLING CONVENTION (
Записан
merke
Гость
« Ответ #5 : Март 05, 2012, 20:48 »

спасибо большое за помощь. теперь следующая ошибка в VB вылетает can't find DLL entry point someFunc in test_lib
Записан
merke
Гость
« Ответ #6 : Март 05, 2012, 21:01 »

Добавил вот это:

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

и заработало. теперь Qt получает крякозяблики блин(
Записан
Странник
Гость
« Ответ #7 : Март 05, 2012, 22:22 »

Цитировать
it is actually passing a pointer to a pointer to a string
какбэ намекаэ
Записан
merke
Гость
« Ответ #8 : Март 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 просто напросто вылетает...

Всем огромное СПАСИБО за оказанную помощь!!!
« Последнее редактирование: Март 06, 2012, 09:25 от Александр » Записан
merke
Гость
« Ответ #9 : Март 06, 2012, 11:17 »

Компилятор ругается release/main.o:main.cpp:(.text+0x2f): undefined reference to `SysAllocString@4'
Записан
merke
Гость
« Ответ #10 : Март 06, 2012, 11:29 »

Во! Спасибо! только теперь в VB возвращается только первый символ( из всего набора, которые я передаю в библиотеку
Записан
merke
Гость
« Ответ #11 : Март 06, 2012, 11:34 »

Вывел просто на форму функций Print и увидел что пришли все символы, но в компоненты когда выводишь, отображается только один символ. Видно не в той кодировке возвращается, получается какое то двухбайтовое представление
Записан
merke
Гость
« Ответ #12 : Март 06, 2012, 11:45 »

Да, теперь получается мне вернулось в UTF16 а мне нужно UTF8
Записан
merke
Гость
« Ответ #13 : Март 06, 2012, 11:46 »

Каждый символ два байта( а мне этого не нужно)
Записан
merke
Гость
« Ответ #14 : Март 06, 2012, 12:41 »

тоже самое, уже пробовал)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.135 секунд. Запросов: 18.