2013-10-01 3 views
1

Мы скомпилировали C++-программу как DLL и хотим использовать ее с VB6. Программа имеет подпрограммы, какC++ DLL-программа из VB6 не найдена

int __stdcall setup(int exposure_time, double shutter, double gain, int numImages) { 
.... 
} 

int __stdcall test() { 
    return 8; 
} 

И файл Def определяется как:

LIBRARY 
EXPORTS 
    setup=setup 
    test=test 

И мы объявляем их в VB6, как это:

Public Declare Function setup Lib "C:\MyDll.dll"() As Long 

Public Declare Function test Lib "C:\MyDll.dll"() As Long 

И пытается получить доступ, то в a. Форма:

Private Sub Form_Load() 

    Debug.Print (test()) 

End Sub 

Но мы получаем «Файл не найден» в VB, когда исполнение достигает самого первого вызова функции! Программа MyDll.dll находится в объявленном месте и не регистрируется. Что не хватает для объявления?

Здравствуйте Вирсавия,

Я последовал за ваши предложения, но программа VB еще не может найти библиотеку DLL.

Объявления в VB:

Public Declare Function setup Lib "C:\Math\FlyCapture2\bin\PGLCTrigger.dll" (_ 
    ByVal exposure_time As Long, _ 
    ByVal shutter As Double, _ 
    ByVal gain As Double, _ 
    ByVal numImages As Long) As Long 

Public Declare Function test Lib "C:\Math\FlyCapture2\bin\PGLCTrigger.dll"() As Long 

Защиту файла:

LIBRARY 
EXPORTS 
    [email protected] 
    [email protected] 

программа C++:

__declspec(dllexport) int __stdcall setup(int exposure_time, double shutter, double gain, int numImages) { 
.... 
} 

__declspec(dllexport) int __stdcall test() { 
    return 8; 
} 

И программа VB вызова:

Private Sub Form_Load() 

     setup 12, 24#, 1#, 10 
     test 

End Sub 

Как только выполнение попадает в установочную строку в программе выше, появляется ошибка «dll not found».

Я определил следующее в .def файл, как предложено Compile a DLL in C/C++, then call it from another program:

//DLL Export-Import definitions 
#ifdef BUILD_DLL 
#define EXPORT __declspec(dllexport) 
#else 
#define EXPORT __declspec(dllimport) 
#endif 

Так что я могу ссылаться на функции в DLL, как

EXPORT int __stdcall setup(int exposure_time, double shutter, double gain, int numImages) 

Но VS2010 выдает сообщение об ошибке для импорт.

Итак, я застрял. Любая дополнительная помощь будет оценена очень много. Спасибо.

+0

Возможно, у нас есть точное сообщение об ошибке –

+0

Здравствуйте, Дэвид, ошибка «Ошибка времени выполнения» 48 ', Файл не найден c: \ ... \ MyDll.dll, возвращенный с VB6, когда выполнение включено "setup 12,24,1,10 ". – user1046647

ответ

1

Другие сказали вам, что вы должны объявить параметры для этой функции. Если DLL не загружается, и вы уверены, что она есть, то, вероятно, отсутствует зависимость. Отлаживайте это с помощью Dependency Walker. Загрузите исполняемый файл и запустите его в режиме профиля из меню «Профиль». Это будет регистрировать события загрузчика, и вы точно увидите причину сбоя.

+0

Если я запустил PCTriggerDll. Dll в подходе зависимостей Я получаю кучу ошибок API-MS-Win ... Если я запустил исполняемый файл Vb-программы, то я получаю MSVBVM60.dll не найденную ошибку. Но даже если я поместил этот файл в каталог, exec utable работает, он все еще не может найти dll. Таким образом, вы можете быть правы, возможно, отсутствует файл зависимых. Но какой. – user1046647

+0

Не беспокойтесь о ошибках статического анализа в DLL. Это время исполнения. И похоже, что вам не хватает некоторых файлов времени исполнения VB6. –

+0

Я поместил несколько файлов в исполняемый файл программы вызова VB. Это нормально! Но программа не может найти DLL в среде разработки VB! Вы правы. Мне нужно искать необходимые файлы. Еще раз спасибо. – user1046647

0

Вы должны сказать VB6 об аргументах функции для setup:

Public Declare Function setup Lib "C:\MyDll.dll" (_ 
    ByVal exposure_time As Long, _ 
    ByVal shutter As Double, _ 
    ByVal gain As Double, _ 
    ByVal numImages A Long) As long 

И ваш файл .def, я думаю, это неправильно. Я использую

EXPORTS 
    setup @1 
    test @2 

Где 1 и 2 являются произвольными, но различными положительными целыми числа называется порядковыми. Несколько замечаний:

A Long в VB - это int на C++.

Вместо файла .def вы можете использовать __declspec(dllexport) и extern "C" {/*your function here*/}.

+0

Здравствуйте, Вирсавия, Спасибо, что обратились за помощью. Я следил за вашими предложениями, но я все еще получаю DLL не найденную ошибку. См. Текст в моем вопросе выше для дальнейшего кода. Другие идеи? – user1046647

+0

Да , сделайте так, как говорит Дэвид Хеффернан, и попробуйте поместить файл MSVBVM60.dll в ту же папку, что и PGLCTrigger.dll (или как вы его называете), как временная мера, пока вы не выясните, что происходит. – Bathsheba

Смежные вопросы