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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено]Написание dll на с++  (Прочитано 5448 раз)
merke
Гость
« : Март 22, 2010, 14:17 »

Всем привет!
Встала задача написать dll на c++, чтобы потом её можно было подключить и использовать в visual basic 6. Да вот такое вот извращение, но что поделаешь надо реализовать!

Допустим у меня есть такая функция:

Код:
int sum(int x, int y)
{
   return x+y;
}


Потом после компиляции библиотеки я буду подключать к проекту следующим образом:

Код
Visual Basic
Private Declare Function sum Lib "C:\SomeProject\mydll.dll" (ByVal x As long, ByVal y As long) As long

Использую в API вызове тип LONG потому что в vb интереджеровский тип занимает 2 байта, а в с++ 4.

Так вот теперь теперь сам вопрос! Где мне писать саму библиотеку в VC++ или C++ Builder 6.0 или может даже можно в Qt???

Пожалуйста, если можно, показать на маленьком примере. Этот вопрос много раз ставился на других форумах, но так ни кто и не мог дать вразумительный ответ.

Буду очень благодарен за оказанную мне помощь!

С уважением, Александр!
« Последнее редактирование: Март 22, 2010, 16:44 от merke » Записан
merke
Гость
« Ответ #1 : Март 22, 2010, 14:57 »

Пробую вот так в VC++:

Cоздаю проект "Win32 Dynamic-Link Library"

DLLTEST.H

Код:
#ifndef _DLLTEST_H_
#define _DLLTEST_H_

#include <stdio.h>
#include <windows.h>

extern "C" __declspec(dllexport) int summa(int x, int y);


#endif

DLLTEST.CPP

Код:
#include "dlltest.h" 

extern "C" __declspec(dllexport) int summa(int x, int y)
{
   return x+y;
}

Всё компилю получаю три файла dll, lib, exp

В vb пишу:

Код
Visual Basic
Public Declare Function summa Lib "c:\dlltest.dll" _
   (ByVal x As Integer, ByVal y As Integer) As Integer
 
MsgBox summa(1, 1)

При запуске вижу ошибку: "Bad DLL calling convention"

SOS, нужна помощь)))


Записан
niXman
Гость
« Ответ #2 : Март 22, 2010, 15:25 »

для начала, скажи, какую "конверсию" ожидает vb ?
Записан
merke
Гость
« Ответ #3 : Март 22, 2010, 15:50 »

а подробнее, я понимаю под конверсией преобразование объектов исчисления
Записан
niXman
Гость
« Ответ #4 : Март 22, 2010, 16:04 »

гуглить по ключевым словам "calling convention"
Записан
merke
Гость
« Ответ #5 : Март 22, 2010, 16:43 »

В общем спасибо за подсказку, сделал так и всё заработало:

DLLTEST.H

Код:
#ifndef _DLLTEST_H_
#define _DLLTEST_H_
#include <stdio.h>
#include <windows.h>
long _stdcall PassStrStdCall(int x, int y);
#endif

DLLTEST.CPP

Код:
#include "dlltest.h" 


long _stdcall PassStrStdCall(int x, int y)
      {
       return x+y;
      }

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

      LIBRARY   TESTDLL
      CODE      PRELOAD MOVEABLE DISCARDABLE
      DATA      PRELOAD SINGLE
      EXPORTS
      PassStrStdCall     @1

Теперь в VB делаю следующее:

Код
Visual Basic
 Private Declare Function PassStrStdCall Lib "dlltest.dll" _
                                  (ByVal x As Integer, ByVal y As Integer) As Long
 
Private Sub Form_Click()
Dim s As Integer
  s = PassStrStdCall(1, 1)
  Print s
End Sub

И всё работает, всем спасибо!!!





Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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