Пишу плагин для "The Bat" и столкнулся с проблемой перевода с VC, работой функций и памятью в native dll.
1.
На VC она выглядит так:
- Код: Выделить всё
int WINAPI TBP_GetName(char* ABuf, int ABufSize)
{
MessageBox(NULL, ABuf, "TBP_GetName", MB_OK);
return (getstr(strName, ABuf, ABufSize));
}
Эта функция передаёт название плагина и размер строки в байтах.
getstr - функция копирования строки, в ней используется strncpy.
Как будет правильно выглядеть эта функция на VB и есть-ли strncpy на VB?
2. В моём варианте перевода этой функции постоянно вылетает ошибка access violations at address in "ntdll"(oleaut) read address(write adress), при этом невозможно даже обратиться к переменной, так же вылетает с ошибкой. Что Я делаю не так?
Ошибки появляются если Я пытаюсь копировать или прочитать данные с этих переменных, даже при простой попытке узнать длину переменной через Len() (когда они объявлены как ByRef).
Думал что char* передаётся как указатель, хотя судя по PB он передаётся как указатель, он либо выдаёт ошибку либо выдаёт 0. Пробовал переписывать на PB, такие же ошибки.
Мой вариант перевода этой функции.
- Код: Выделить всё
Function TBP_GetName(ByVal ABuf As Long, ByVal ABufSize As Long) As Long
dim sstr As String,hstr As Long
Dim llng As Long
sstr = "TEST"
hstr = StrPtr(sstr)
llng = ABufSize
MessageBox 0, SysAllocString(ABuf) & Str(llng), "TBP_GetName", 0
End Function
Проверял на Total Commander, написал для него тестовый плагин, все переменные читаются и изменяются без ошибок.
3. Как правильно объявить SysAllocString, SysAllocStringLen и SysAllocStringByteLen? В APIviewer, который с AllAPI.net объявления почему-то as Byte и при вызове вылетает ошибка overflow, с SysAllocString Я разобрался, а остальные всёрано выдают ошибку.
4. Немного ламерский вопрос, как в copymemory да и вообще в API функциях правильно расставлять byval, или где про это можно прочитать?
P.S.
Читал статьи и ответы на некоторые темы, что-то помогло, где-то пока не разобрался ещё.
Пользуюсь "компилятором native DLL" от Хакера, единственный, который нормально создаёт такие библиотеки.