Russian Qt Forum

Программирование => С/C++ => Тема начата: merke от Марта 22, 2010, 14:17



Название: [Решено]Написание dll на с++
Отправлено: 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???

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

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

С уважением, Александр!


Название: Re: Написание dll на с++
Отправлено: merke от Марта 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, нужна помощь)))




Название: Re: Написание dll на с++
Отправлено: niXman от Марта 22, 2010, 15:25
для начала, скажи, какую "конверсию" ожидает vb ?


Название: Re: Написание dll на с++
Отправлено: merke от Марта 22, 2010, 15:50
а подробнее, я понимаю под конверсией преобразование объектов исчисления


Название: Re: Написание dll на с++
Отправлено: niXman от Марта 22, 2010, 16:04
гуглить по ключевым словам "calling convention"


Название: Re: Написание dll на с++
Отправлено: merke от Марта 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

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