Вопрос
У меня есть библиотека 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);
}
}
Это все, что нужно для начала.