Приветствую,
такая вот проблема:
есть dll на дельфи (без исходников), листочек документации к ней(прототипы функций) и небольшой примерчик тоже на дельфи, который эту dll вызывает.
//прототип из документации
procedure connect(hostName, portNumber: PChar); stdcall; external CustomDll;
//кусок из примерчика
...
begin
try
connect(PChar(EditHost.Text), PChar(EditPort.Text));
except
On E: Exception do
begin
S := getExceptionInfo(E); //see below
writeln(S);
raise Exception.Create(S);
end;
end;
end;
//там же из примечика
function getExceptionInfo(E: Exception): PChar;
var
S: String;
buf: array[0..512] of char;
begin
S := E.ClassName + ', ' + E.Message;
StrLCopy(buf, PChar(S), SizeOf(buf));
Result := buf;
end;
все работает замечательно (примерчик на дельфи то есть), когда правильные параметры даешь(адрес и порт) то просходит коннект, если же неправильные — генерится исключение (таймаут) и красиво пишется как в консольное окошко так и в мевсседжбокс.
Теперь мне надо позвать эту функцию из VC++ 6.0 (и исключения обработать)
мой код:
...
typedef void (_stdcall * LPconnect)(LPTSTR,LPTSTR);
HINSTANCE hDLL; // Handle to DLL
LPconnect pconnect; // Function pointer
hDLL = LoadLibrary("customdll.dll");
if (hDLL != NULL)
{
pconnect= (LPconnect )GetProcAddress(hDLL,
"connect ");
if (!pconnect)
{
// handle the error
FreeLibrary(hDLL);
}
else
{
try
{
// call the function
pconnect (_T("aaa"),_T("bbb"));
}
catch(CException * e)
{
e->ReportError();
e->Delete();
}
}
вроде выглядит нормально,(хандле от длльки и указатель на функцию валидные),
но при выполнениии "unchandled exception" (причем в обоих случаях, т.е когда правильные и когда неправильные параметры)
получается , что CException и все порожденные мы не ловим.
// меняю catch блок на
catch(...)
{
ASSERT(FALSE);
}
теперь нормально, попадаю в catch, но никакойиформации об исключении получить нельзя (а может можно? как?)
пробовал применитиь структурную систему
//вот так примерно
DWORD FilterFunction(LPEXCEPTION_POINTERS pe)
{
ASSERT(pe->ExceptionRecord->ExceptionCode);
return EXCEPTION_EXECUTE_HANDLER;
}
.....
__try
{
// call the function
pconnect (_T("aaa"),_T("bbb"));
}
__except ((FilterFunction(GetExceptionInformation()))
{
ASSERT(FALSE);
}
также ловится( точка останова на return EXCEPTION_EXECUTE_HANDLER; )
при этом
pe->ExceptionRecord->ExceptionCode = 0x0eedfade (стабильно)
и
pe->ExceptionRecord->NumberParameters=7;
pe->ExceptionRecord->ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]также семь заполнено
нигде не нашел, что значит 0x0eedfade, а также как достать строчку для месседжа отсюда (ExceptionInformation???)
короче я в тупике,
кто то мжет делал примерно такоеже, что я пропустил?
проблема в том что имею предубеждение к дельфям, поэтому не ориентируюсь там совсем,
stdcall в дельфях имеет другой смысл? PChar это не LPTSTR?
у кого какие идеи?
заранее благодарен