вызов функции из длл на дельфи (и исключения при этом )
От: Lecha  
Дата: 13.05.04 18:46
Оценка:
Приветствую,
такая вот проблема:
есть 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?
у кого какие идеи?
заранее благодарен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.