DLL

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

DLL

Сообщение Debugger » 29.01.2010 (Пт) 17:27

Есть DLL-ка, написанная на C++. Функция в ней объявлена так:
Код: Выделить всё
BOOL WINAPI MyFunc(
    IN LPCSTR lpszUrl,
    OUT LPSTR lpszBuffer,
    IN OUT LPDWORD lpdwBufferLength,
    IN DWORD dwFlags )

Библиотечку успешно скомпилировал, положил в system32, запустив regsvr32:
Код: Выделить всё
C:\WINDOWS\system32\DLLtest.dll была загружена, но найти точку входа для DllRegisterServer не удалось.
Зарегистрировать этот файл невозможно.

Гм... ладно, идем дальше. В Бейсике такой код:
Код: Выделить всё
Private Declare Function MyFunc Lib "DLLtest" (lpszUrl As String, lpszBuffer As String, lpdwBufferLength As Long, dwFlags As Long) As Boolean

Я не совсем понял, что значит LPDWORD (да и с другими параметрами наверняка напутал), и функция не работает.
Как правильно объявить и вызвать эту функцию в VB6?
P.S. Если надо, могу привести полный код C++.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: DLL

Сообщение iGrok » 29.01.2010 (Пт) 17:40

Эээ.. А regsvr32 тут вообще при чём? =)
Это ж не COM-библиотека. =)

А вот с объявлениями всего остального.. Хм.. А что говорит VB при вызове?
label:
cli
jmp label

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Re: DLL

Сообщение Александр Дмитриев » 29.01.2010 (Пт) 18:35

Попробуй так
Код: Выделить всё
Private Declare Function MyFunc Lib "DLLtest" (ByVal lpszUrl As String, ByVal lpszBuffer As String, lpdwBufferLength As Long, ByVal dwFlags As Long) As Long

И строки ей нужно передавать фиксированные: ... As String * ...

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: DLL

Сообщение Debugger » 29.01.2010 (Пт) 19:42

Ошибка такая:
Код: Выделить всё
Can't find DLL entry point MyFunc in dlltest

Потому я и решил её regsvr'нуть.

Скорее всего, я что-то неправильно написал в библиотечке (в C++ я не силён):
DLLtest.cpp
Код: Выделить всё
// DLLtest.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"


#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                )
{
    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

BOOL WINAPI MyFunc(
    IN LPCSTR lpszUrl,
    OUT LPSTR lpszBuffer,
    IN OUT LPDWORD lpdwBufferLength,
    IN DWORD dwFlags )
{
   return true; //)
};

Остальные файлы по умолчанию.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: DLL

Сообщение Mikle » 29.01.2010 (Пт) 20:13

Debugger
Создай def файл с именами экспортируемых ф-ций, компилятор C++ изменяет имена, без этого файла. Или посмотри каким-нибудь ExeScope получившееся имя и задействуй Alias.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: DLL

Сообщение Debugger » 29.01.2010 (Пт) 22:51

Спасибо всем ответившим!
Последний раз редактировалось Debugger 06.02.2010 (Сб) 23:24, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: DLL

Сообщение Хакер » 30.01.2010 (Сб) 1:44

Александр Дмитриев писал(а):И строки ей нужно передавать фиксированные: ... As String * ...

Глупости.

Can't find DLL entry point MyFunc in dlltest


Потому я и решил её regsvr'нуть.

Глупость, большая. Регистрация нужна только ActiveX- (даже не просто COM- ) библиотекам,чтобы уметь по CLSID-у/ProgId-у класса найти библиотеку с его реализацией. Не более того.

Код: Выделить всё
#ifdef _MANAGED
#pragma managed(push, off)
#endif

Эти куски надо сразу вырезать.

Типу BOOL не соответствует VB-шный Boolean.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: DLL

Сообщение Debugger » 06.02.2010 (Сб) 23:23

Не хочется создавать новую тему (да и раздела C++ на конференции нет).
Написал код для вывода форматированной строки в файл:
Код: Выделить всё
int __cdecl printf(const char * format, ...)
{
    char Buff[1024];
    Int retV;
    DWORD cbWritten;
    va_list argptr;
   
    va_start( argptr, format);
    retV = wvsprintf( LPWSTR(Buff), LPWSTR(format), argptr );
    va_end( argptr );
   
    WriteFile( OP, Buff, retV, &cbWritten, 0 );
    return retValue;
}

Я вызываю его так: printf("A %s C %s","B","D");. Вроде бы, он должен выводить в файлик "A B C D". Но не выводит. В чем же проблема?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: DLL

Сообщение Хакер » 06.02.2010 (Сб) 23:31

Юникодно-ансишное месево это, а не код. Правь.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: DLL

Сообщение Debugger » 07.02.2010 (Вс) 20:41

Исправил:
Код: Выделить всё
int __cdecl printf(const char * frmt, ...)
{
    char szBuff[1024];
    int retV;
    DWORD cbWritten;
    va_list argptr;

    va_start( argptr, frmt);
    retV = vsprintf( szBuff, frmt, argptr );
    va_end( argptr );

    WriteFile( OP, szBuff, retV, &cbWritten, 0 );

    return retV;
}

Работает! Спасибо.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Majestic-12 [Bot] и гости: 21

    TopList