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





При использовании __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.