Объявление VB6 для функции C ++ дает «Соглашение о неправильном вызове DLL» quot;

Какое правильное объявление VB6 для этой функции C ++?

LPCWSTR* MW_ListReaders(_ULONG Context, int* NumberOfReaders);

Следующее дало мне «Плохое соглашение о вызове DLL»:

Private Declare Function ListReaders Lib "MyDLL.dll" (ByVal Context As Long, _
ByRef NumberOfReaders As Integer) As Long

0

Решение

В этом объявлении C ++ нет соглашения о вызовах. Большинство компиляторов C / C ++ по умолчанию __cdecl, Если функция действительно использует __cdecl тогда вы не сможете вызвать его в VB6:

Как вызывать функции C, использующие соглашение о вызовах _cdecl

Невозможно напрямую вызвать функцию C в DLL, если эта функция использует соглашение о вызовах _cdecl. Это связано с тем, что Visual Basic использует соглашение о вызовах _stdcall для вызова функций. Это проблема, потому что если используется _cdecl, вызывающая функция отвечает за очистку стека. Однако, если используется _stdcall, вызываемая функция отвечает за очистку стека.

ПРИМЕЧАНИЕ. Файл .EXE, созданный в Visual Basic, позволит вам без ошибок вызывать функцию DLL, которая была объявлена ​​с соглашением о вызовах _cdecl. Только при попытке вызвать такую ​​функцию при запуске программы из среды разработки Visual Basic Visual Basic генерирует следующую ошибку:

Ошибка выполнения ’49’:
Соглашение о неправильном вызове DLL

Тот факт, что версия EXE позволяет вам вызывать такие функции, был подтвержден Microsoft как ошибка. Вы не должны полагаться на это поведение, поскольку оно может измениться в будущих версиях Visual Basic.

5

Другие решения

В дополнение к ответу Реми, вы также немного ошиблись в объявлении Vb:

Private Declare Function ListReaders Lib "MyDLL.dll" (ByVal Context As Long, ByRef NumberOfReaders As Long) As Long

«Integer» — это 2-байтовое целое число в vb.

0