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

У меня есть 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


Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
8 961
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

LIBRARY mylibname
EXPORTS
    myfirstfunction
    secondfunction

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

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

#define MYDCC_API __declspec(dllexport) __stdcall

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

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

Открытая функция vbConcat (ByVal a как строка, ByVal b как строка) как строка 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" using пространство имен VBTestLib;

недействительным 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);
   }

}

Это все, что нужно для начала.

У вас есть это наоборот. Вопрос был по экспорту из C++ и импорту в VB6.

Joe M 07.05.2013 21:18

Другие вопросы по теме