Сообщения окна отлавливаются нормально, но при закрытии окна возникает ошибка: память не может быть "read". Подскажите пожалуйста, где я допустил ошибку.
терь можно долго гадать, на обращение к чему идет бага...
самый простой вариант - поюзать ollydbg, найти в какой строке кода на какое действо бага. на крайний случай хотя бы адрес исключения - в системных либах или в твоем коде.
жесть ваще за такое все таки руки нада отрывать
а в олли ты не то видишь. нада залезть в настройки, отрубить игнорирование всех исключений(убрать все галки), дальше запустить в олли твой прого с длл, хукнуть прогу и звкрыть прогу - тада олли вывалится на бажный код. можешь ради интереса вставить сюда строк 10. 5 до строки с ошибкой и 5 после.
Я понимаю что это не спортивно, но я не вижу причины почему я не могу принудительно закрыть процесс, если он и так собирался закрыться или остается вероятность наступить на грабли?
Если ошибка в приложении - я все равно ее не устраню, т.к. это не мое приложение.
дело не в спортивности. бага, корни который непонятны, может проявица в разных формах. нету гарантий, что кильнув процесс баги не будет. если б гарантировать, что такой способ решения 100% спасет - то сгодится.
Таки ты прав, создал dll с функцией Subclass, но без функций необходимых для подключения плагина и сделал вызов из приложения функции Subclass (приложение поддерживает работу с dll) - все ок, ошибки не происходит.
Получается виноваты ф-ции связки плагина с приложением .
Ф-ции связки все однотипные, в SDK есть пример на Си, я сделал аналог на PB:
Си:
char szObjectName[] = "MyPlugin";
int GetPluginName(char* szBuffer, int* pnBufferSize)
{
int nLength = lstrlen(szObjectName);
if(*pnBufferSize < nLength)
{
*pnBufferSize = nLength;
return -1;
} else
{
memset(szBuffer,0,*pnBufferSize);
lstrcpy(szBuffer,szObjectName);
return nLength;
}
}
GetPluginName
Purpose: To return the name of the action plugin to the calling program. Keep this short
but descriptive. For example, if your plugin is used to access ADO databases, call it
something like “ADODatabase”.
Prototype:
int GetPluginName(char* szBuffer, int* pnBufferSize)
Parameters:
szBuffer - [out] A pointer to a character buffer that will receive the name of the plugin.
pnBufferSize - [in/out] A pointer to an integer that contains the number of characters in
szBuffer on the way in and will be set to the number of characters actually copied to the
buffer on the way out.
Returns:
The number of characters copied to the buffer or -1 if the buffer was not large enough to
contain the plugin’s name. If you return -1, be sure that you set pnBufferSize to the
number of characters actually required.
PB:
MACRO szObjectName = "MyPlugin"
FUNCTION GetPluginName CDECL ALIAS "GetPluginName" (BYREF szBuffer AS ASCIIZ, BYREF pnBufferSize AS LONG) EXPORT AS LONG
IF(pnBufferSize < lstrlen(szObjectName)) THEN
pnBufferSize = lstrlen(szObjectName)
FUNCTION = -1
ELSE
lstrcpy(szBuffer, szObjectName)
FUNCTION = lstrlen(szObjectName)
END IF
END FUNCTION
Я не вижу причину, которая может повлиять на работу Subclass или все таки мой налог кода не корректен?