Bonita Montero
unread,Sep 12, 2022, 1:59:27 AM9/12/22Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Sign in to report message as abuse
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to
Wenn man bei einer C-API einen Callback hat, dann kann man daraus ja
nur auf globale Variablen bzw. das, auf was der void-Pointer der einem
gegebenenfalls mitgegeben wird zeigt zugreifen.
Hier ein kleines Beispiel wie man in C++11 / C++20 auch direkt auf
lokale Variablen zugreifen kann.
#include <iostream>
#include <vector>
#include <string>
#include <link.h>
#include <climits>
#include <dlfcn.h>
using namespace std;
template<typename Fn>
#if defined __cpp_concepts
requires requires( Fn fn, dl_phdr_info *image, size_t n ) { { fn(
image, n ) } -> same_as<int>; }
#endif
int dlIteratePhdr( Fn fn )
{
return dl_iterate_phdr(
[]( dl_phdr_info *image, size_t size, void *pFn ) -> int
{
return (*(Fn *)pFn)( image, size );
}, &fn );
};
int main()
{
size_t nImages = 0;
dlIteratePhdr( [&]( dl_phdr_info *, size_t ) -> int { ++nImages; return
0; } );
vector<string> images;
images.reserve( nImages );
if( dlIteratePhdr(
[&]( dl_phdr_info *image, size_t ) -> int
{
try
{
images.emplace_back( image->dlpi_name );
return 0;
}
catch( bad_alloc const & )
{
return 1;
}
} ) )
return EXIT_FAILURE;
for( string const &image : images )
cout << "\"" << image << "\"" << endl;
}
Is das nicht geil ? Kein Gefledder mit globalen Funktionen mehr !