Używam Delphi do tworzenia dodatku XLL dla programu Excel, co wiąże się z wykonywaniem wielu wywołań funkcji Excel4v pliku xlcall32.dll. Jednak, jak przypuszczam, niewielu ekspertów Delphi pracowało z tym konkretnym API, mam nadzieję, że problem ten można było zaobserwować również w innych interfejsach API.Wywołanie określonego API Win32 z Delphi - Dlaczego wyjątki leżą bez "asm pop ..."?
W C, a konkretnie w pliku xlcall.h że pochodzi z Microsoft Excel 2007 XLL SDK, Excel4v jest zdefiniowany jako:
int pascal Excel4v(int xlfn, LPXLOPER operRes, int count, LPXLOPER opers[]);
W Delphi Używam:
function Excel4v(xlfn: Integer; operRes: LPXLOPER; count: Integer;
opers: array of LPXLOPER): Integer; stdcall; external 'xlcall32.dll';
LPXLOPER jest wskaźnikiem do struktury (w C) lub rekordu (w Delphi).
Odrabiam zadania domowe dotyczące deklarowania funkcji C w Delphi (this excellent article była bardzo pomocna) i myślę, że deklaruję poprawnie Excel4v. Wzywa jednak z kodu Delphi w tym wyjątków funkcja przyczyna („naruszenia zasad dostępu ...” to co ja widuję) chyba są następnie następującej linii:
asm pop sink; end;
Gdzie „sink” definiuje się gdzieś jako liczba całkowita.
Nie mam pojęcia o montażu ... Więc nie ma sposobu, bym pomyślał, aby spróbować naprawienia wyjątków za pomocą "asm pop sink; end;". Ale "pop upton pop, end;" naprawia wyjątki. Po raz pierwszy zobaczyłem, że był używany w this useful article on making XLLs using Delphi. Oto najbardziej istotne cytat:..
„z Delphi wielkim zgorszeniem z dodatków jest dodatkowy parametr po adresem zwrotnym na stosie To jest za darmo przy każdym wywołaniu Excel I” Nigdy nie dowiedziałem się, co to jest posiada, ale tak długo, jak wyrzucisz go z dala, twój dodatek będzie działał poprawnie Dodaj linia asm pop zmienna, koniec, po każde połączenie, gdzie zmienna może być dowolna globalna, lokalna lub zmienna obiektu, która ma długość co najmniej 4 bajtów, jest liczbą całkowitą . Aby powtórzyć, TO MUSI BYĆ INCLUDED po każdym wywołaniu Excel4v. Inaczej jesteś skonstruowania bomby zegarowej „
Zasadniczo Chcę zrozumieć, co się właściwie dzieje i dlaczego. Co może być przyczyną funkcji Win32 do zwracania” dodatkowy parametr po adresie zwrotu z stosu „a co to właściwie znaczy?
Może istnieć inny sposób rozwiązać ten problem, na przykład z inną opcją kompilatora lub inny sposób deklarowania funkcji?
a czy jest coś ryzykowne o wywołanie” ASm pop sink; koniec, "po każdym wywołaniu Excel4v ...? Wydaje się, że działa dobrze, ale, jak nie rozumiem, co się dzieje, czuje się trochę niebezpieczne ...
Piszę XLL w Delphi i chciałbym się z Tobą skontaktować. Napisz do mnie na adres [email protected] – garethm