Вопрос

У меня есть библиотека DLL для Windows, которую я написал, написанная на 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


Это было полезно?

Решение

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

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

LIBRARY mylibname
EXPORTS
    myfirstfunction
    secondfunction

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

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

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

#define MYDCC_API __declspec(dllexport) __stdcall

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

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

Публичная функция vbConcat(обычно a как строка, обычно b как строка) Как строка vbConcat = a & b Конечная функция

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

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

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

#импорт "F:\proj\VB6\ActiveXDLL\VBTestDLL.dll" используя пространство имен 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);
   }

}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top