Наконец я смог решить проблему благодаря помощи GSerg и Дэвида Хеффернана.
Здесь IDL будет использоваться для генерации .tlb
[
uuid(12345678-1234-1234-1234-123456789ABC),
version(1.0)
]
library myTypeLib
{
[dllname("myLib.dll")]
module myLib
{
[entry("myFunc")]
int __stdcall myFunc( LPSTR filename_in, LPSTR filename_out, LPSTR ErrMsg);
};
};
Для компиляции используйте команду «midl» в командной строке Visual Studio.
Полученный файл .tlb должен быть помещен в один каталог проекта VB6 вместе с DLL.
В проект VB6 в Project-> References можно добавить файл .tlb.
Если все прошло хорошо, нажав F2, можно было бы заметить «myTypeLib» в списке доступной библиотеки.
Теперь можно вызывать «myFunc» внутри проекта VB6!
Однако следует отметить две проблемы:
1) Некоторые типы переменных несовместимы между VB6 и C. Примером этой проблемы являются массивы символов. В то время как в VB6 они объявлены как Dim myStr as String
, в C они обычно объявляются как char myStr[MAX_DIM];
. Чтобы сделать возможным перевод между VB6 и C без модификации DLL, можно объявить строки на стороне VB6 как Dim myStr as String * 256
, тогда как в файле IDL соответствующая строка должна быть передана функции как LPSTR myStr
.
2) VB6 не связывает библиотеки DLL, пока не создан .exe. Но если DLL не связана, то ее функции не видны. По этой причине все функции неявно связанных библиотек DLL, которые должны использоваться в проекте VB6, должны быть включены в файл IDL.
Более того, по той же причине, даже после того, как все функции были включены в файл IDL, будет невозможно запустить программу из IDE (она будет аварийно завершать работу), так как она будет отлаживаться. Единственный способ запустить приложение - создать .exe.