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

У меня есть DLL для Windows, которую я написал на C/C++ (все экспортируемые функции на "C"). DLL отлично работает для меня в VC++. Я дал DLL другой компании, которая делает все свои разработки в VB. Кажется, у них проблемы со связью с functions. Я не использовал 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



person Tim Ring    schedule 02.09.2008    source источник


Ответы (3)


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

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

LIBRARY mylibname
EXPORTS
    myfirstfunction
    secondfunction

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

person Konrad Rudolph    schedule 02.09.2008

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

#define MYDCC_API __declspec(dllexport) __stdcall

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

person Re0sless    schedule 02.09.2008

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

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

}

Вот и все, для начала.

person tracker    schedule 30.04.2010
comment
У вас это задом наперед. Вопрос был для экспорта из С++ и импорта в VB6. - person Joe M; 07.05.2013