2008-09-02 3 views
2

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

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

#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


ответ

4

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

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

LIBRARY mylibname 
EXPORTS 
    myfirstfunction 
    secondfunction 

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

3

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

#define MYDCC_API __declspec(dllexport) __stdcall 

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

0

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

Public Function vbConcat (ByVal As String, ByVal б As String) As String vbConcat = а & б End Function

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

вы должны зарегистрировать DLL с помощью Windows, команда regsvr32 F: \ proj \ VB6 \ ActiveXDLL \ VBTestDLL.Dll

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

#import "F: \ проектируемый \ 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); 
    } 

}

Это все есть на него, чтобы начать игру.

+1

У вас есть это назад. Вопрос заключался в том, чтобы экспортировать из C++ и импортировать в VB6. – 2013-05-07 17:18:48