Страница: 1 | 2 |
Вопрос: Перевести из С++
Добавлено: 22.10.04 13:37
Автор вопроса: LamerOnLine | ICQ: 334781088
ULONG PacketGetAdapterNames(PTSTR pStr, PULONG BufferSize)
Понятно, ULONG - long и есть, неважно что Unsigned. PTSTR как лучше передать? Как byval as String? И PULONG как byref as long?
Заколебался, на все варианты выдает BAD DLL Convention. Help!
Ответы
Всего ответов: 23
Номер ответа: 1
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #1
Добавлено: 22.10.04 14:01
Ну, кто знает?
Может быть можно передать PTSTR как byval as long, а значение взять
StrPtr()? Но не выходит. Возможно PTSTR - не long?
Номер ответа: 2
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #2
Добавлено: 22.10.04 15:05
Да что такое! Все перепробовал. Везде пишут то, что я и сам написал:
Private Declare Function PacketGetAdapterNames Lib "packet" (ByVal pStr As
String, ByRef BufferSize As Long) As Long
Так нифига же. Bad DLL Convention! Мож глюк какой?
К сведению, в Дельфе это
Function PacketGetAdapterNames(pStr:pchar;BufferSize:PLongWord) : LongWord;
cdecl external DLL;
Кто что-нибудь сказать может по этому поводу?
Номер ответа: 3
Автор ответа:
j3d1
ICQ: 8370005
Вопросов: 34
Ответов: 466
Профиль | | #3
Добавлено: 22.10.04 16:43
укажи полное имя ДЛЛ
Номер ответа: 4
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #4
Добавлено: 22.10.04 20:07
§Ј§в§а§Х§Ц §а§Т§С §б§С§в§С§Ю§Ц§д§в§С §Х§а§Э§Ш§Я§н §Т§н§д§о ByVal.
§Є §Ц§л§Ч:
[Public | Private ] Declare Function name [CDecl] Lib "libname"
ЁІ[Alias "aliasname"] [([arglist])] [As type]
Номер ответа: 5
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #5
Добавлено: 22.10.04 20:09
Мдя... Интересно кошка сер.т
Повтор: Оба параметра по идее требуют указатель, я обычно даю их ByVal
И о соглашениях, может указать явно:
[Public | Private ] Declare Function name [CDecl] Lib "libname"
ЁІ[Alias "aliasname"] [([arglist])] [As type]
Номер ответа: 6
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #6
Добавлено: 23.10.04 10:30
А ты массив байтов попробуй и as any
Номер ответа: 7
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #7
Добавлено: 25.10.04 08:16
packet.dll из состава WinPCap 3.01a
Номер ответа: 8
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #8
Добавлено: 25.10.04 08:28
Пробовал массив байтов, но как ByRef и как ByVal VarPtr. Результат тот же.
Подозреваю - глюк VB VM.
Номер ответа: 9
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #9
Добавлено: 25.10.04 08:39
Так ведь указатель на long - то же что и ByRef as Long. Смысла не вижу
передавать по значению. Хотя пробовал. Результат - Bad DLL Convention.
Бывали и иные исходы, когда размер буфера увеличивал. Тогда среда просто
схлопывалась.
Номер ответа: 10
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #10
Добавлено: 25.10.04 09:00
Попробую через LoadLibrary, GetProcAddress и CallWindowProc. Может сработает...
Кстати, вопрос ламерский:
Если функция объявлена через Declare из библиотеки, а затем используется LoadLibrary для той же библиотеки - не загрузит ли прога в память две копии этой dll-ки?
Номер ответа: 11
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #11
Добавлено: 25.10.04 09:57
Прикиньте, такой вот изврат сработал!!:
Option Explicit
Option Base 1
Private Declare Function PacketGetAdapterNames Lib "wpcap" (ByVal pStr As
String, ByRef BufferSize As Long) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As
Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA"
(ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As
Long, ByVal lpProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA"
(ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal
wParam As Any, ByVal lParam As Any) As Long
Dim mHandle As Long
Dim fAddr As Long
Private Sub Form_Load()
Dim sPtr As String
Dim Size As Long
Dim pSize As Long
sPtr = Space(1024)
Dim psPtr As Long
psPtr = StrPtr(sPtr)
Size = Len(sPtr)
pSize = VarPtr(Size)
mHandle = LoadLibrary("Packet.dll"
fAddr = GetProcAddress(mHandle, "PacketGetAdapterNames"
CallWindowProc fAddr, psPtr, pSize, ByVal 0&, ByVal 0&
Text1.Text = sPtr
End Sub
Private Sub Form_Unload(Cancel As Integer)
FreeLibrary mHandle
End Sub
Номер ответа: 12
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #12
Добавлено: 25.10.04 09:59
Пардон, библиотека packet.dll, а не wpcap.dll. Хотя функция эта есть в
обоих. Обе работают! А стандартными средствами VB - ни в какую!!
Номер ответа: 13
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #13
Добавлено: 25.10.04 11:07
Нэ, это недопустимо, загрузчик такое не сделает. А примерчик с CallWindowProc просто супер Я тоже парился над одной длл-кой, теперь знаю как решить проблему Сенкс!
Номер ответа: 14
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #14
Добавлено: 25.10.04 11:09
Вот, ещё, если напишешь тот файрвол, что ты пишешь, в примерах он будет?
Номер ответа: 15
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #15
Добавлено: 25.10.04 11:26
Да, сам не думал что Такое придет в голову. Наверное, это после вчерашних
тех литров пива )