VB6 DLL вызов функции Win32 C - PullRequest
       11

VB6 DLL вызов функции Win32 C

0 голосов
/ 28 января 2012

Мне нужно написать некоторые функции на C для чужого проекта VB6 (устаревшее выходит за рамки этого вопроса).

Во время начальных тестов я не мог заставить вызовы работать.Я предоставил файл .def, я пытался использовать соглашения о вызовах __declspec (dllexport), stdcall и WINAPI.При каждом вызове я получаю сообщение об ошибке в VB6, в котором говорится «плохое соглашение о вызовах DLL».

Прототипы функций Win32 C:

long WINAPI BitmapFile_Open(char *pszFileName);
void WINAPI BitmapFile_Close(long bmf);

.__declspec (dllexport) и stdcall, и ни один из них не работает.

Файл Def:

LIBRARY ImageLib
EXPORTS
BitmapFile_Open @1
BitmapFile_Open @2

Глобальный модуль VB:

 Declare Function BitmapFile_Open Lib "ImageLib.dll" (ByVal fileName As String) As Long
 Declare Function BitmapFile_Close Lib "ImageLib.dll" (ByVal bmFile As Long)

Код VB:

Dim myFile As Long
myFile = BitmapFile_Open("test.bmp")
BitmapFile_Close (myFile)

Также обратите внимание, что в исходных функциях bmFile фактически является адресом (указателем на структуру), но в VB он будет представлен как long.Тем не менее, поскольку VB6 не поддерживает указатели, я долго использую код C.Я надеюсь, что вы можете понять, что я пытаюсь получить здесь.Это не имеет ничего общего с ошибкой, которая происходит.Любая помощь приветствуется.

Редактировать: Я использовал средство обхода зависимостей, чтобы определить, что функции действительно экспортируются.VB6 просто не вызывает их без ошибок.

Ответы [ 3 ]

3 голосов
/ 28 января 2012

BitmapFile_Close должно быть объявлено как Sub в VB6.Я не вижу ничего другого не так.

Посмотрите на совет Microsoft по написанию C-библиотек для вызова из VBПервоначально выпущен с VB5, но все еще имеет отношение к VB6.

0 голосов
/ 29 января 2012

Используйте MIDL для генерации библиотеки типов для вашей DLL, тогда VB6 может использовать информацию о ее типе вместо Declare Function подпрограмм.

Для глобальных функций, я помню, что вы хотите library иmodule определено.

См. VB - Связывание DLL неявным образом

0 голосов
/ 29 января 2012

Попробуйте удалить ByVal из рассматриваемых аргументов (внутри раздела объявлений) один за другим, затем протестируйте и попробуйте удалить все аргументы, затем протестируйте снова. Проведите дополнительные тесты и сообщите, если можете. Это должно сработать!

...