Вызов функций DLL из VB6 - PullRequest
       27

Вызов функций DLL из VB6

2 голосов
/ 02 сентября 2008

У меня есть Windows DLL, которую я написал, написанная на C / C ++ (все экспортируемые функции - 'C'). DLL прекрасно работает для меня в VC ++. Я передал DLL другой компании, которая занимается разработкой в ​​VB. Похоже, у них проблемы с подключением к функциям. Я не использовал VB в течение десяти лет, и я даже не установил его. В чем может быть проблема?

Я объявил все свои публичные функции следующим образом:

#define MYDCC_API __declspec(dllexport)


MYDCCL_API unsigned long MYDCC_GetVer( void);
.
.
.

Есть идеи?


Наконец-то вернулись к этому сегодня и работаем. Ответы поставили меня на правильный путь, но я нашел это наиболее полезным:

http://www.codeproject.com/KB/DLL/XDllPt2.aspx

Кроме того, у меня было несколько проблем с передачей строк в функции DLL, я нашел это полезным:

http://www.flipcode.com/archives/Interfacing_Visual_Basic_And_C.shtml


Ответы [ 3 ]

4 голосов
/ 02 сентября 2008

Используя __declspec для экспорта, имя функции будет экспортировано искажено , т.е. содержит информацию о типе, чтобы помочь компилятору C ++ разрешать перегрузки.

VB6 не может обрабатывать искаженные имена. В качестве обходного пути, вы должны разобрать имена. Самое простое решение - связать файл DLL с помощью файла определения экспорта в VC ++. Файл определения экспорта очень прост и содержит только имя DLL и список экспортируемых функций:

LIBRARY mylibname
EXPORTS
    myfirstfunction
    secondfunction

Кроме того, вы должны указать stdcall соглашение о вызовах, потому что это единственное соглашение о вызовах, которое может обрабатывать VB6. Есть проект, использующий инъекцию в ассемблер для обработки вызовов C, но я думаю, вы не хотите использовать этот сложный и подверженный ошибкам метод.

3 голосов
/ 02 сентября 2008

Попробуйте добавить __stdcall в конце

#define MYDCC_API __declspec(dllexport) __stdcall

У нас есть несколько библиотек C ++, которые взаимодействуют с нашими старыми приложениями VB6, и все они имеют это в конце.

0 голосов
/ 30 апреля 2010

VB6 DLL всегда является COM DLL. Я опишу пример как можно меньше слов. Предположим, у вас есть проект ActiveX DLL в VB6 с классом CTest, который содержит метод, как показано ниже

Открытая функция vbConcat (ByVal a As String, ByVal b As String) As String vbConcat = a & b Конечная функция

и вы установили имя проекта как VBTestLib в свойствах проекта VB6 и Вы скомпилировали проект как F: \ proj \ VB6 \ ActiveXDLL \ VBTestDLL.dll

Вам необходимо зарегистрировать dll с помощью команды Windows regsvr32 F: \ proj \ VB6 \ ActiveXDLL \ VBTestDLL.dll

теперь ваш код C ++:

# import "F: \ proj \ VB6 \ ActiveXDLL \ VBTestDLL.dll" использование пространства имен VBTestLib;

void CDialogTestDlg :: OnButton1 () {

 HRESULT hresult;
 CLSID clsid;
 _CTest *t; // a pointer to the CTest object
 _bstr_t bstrA = L"hello";
 _bstr_t bstrB = L" world"; 
 _bstr_t bstrR;
 ::CoInitialize(NULL);
  hresult=CLSIDFromProgID(OLESTR("VBTestLib.CTest"), &clsid);
  hresult= CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
                               __uuidof(_CTest),(LPVOID*) &t);
  if(hresult == S_OK)
  {
     bstrR  = t->vbConcat(bstrA , bstrB);
     AfxMessageBox((char*)bstrR);
   }

}

Вот и все, чтобы начать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...