定义类型:
typedef int (*vlc_media_player_is_playing(libvlc_media_player_t*));
该类定义了具有此类型的字段。该字段使用dll中的函数地址填充。当您尝试调用函数时,将返回int*
指针而不是int
。为什么会这样?
因此,在指针中数据是正确的。
当您尝试取消引用指针时,程序 崩溃。
我还要添加一个这种类型的例子:
typedef struct libvlc_instance_t libvlc_instance_t;
typedef libvlc_instance_t(*vlc_create_instance(int, const char* const*));
不知怎的,也会立刻返回一个指针。
class Foo
{
...
private:
vlc_media_player_is_playing* libvlc_media_player_is_playing = nullptr;
...
public:
Foo()
{
libvlc_media_player_is_playing = (vlc_media_player_is_playing*)GetSomeAddress("SomeFuncName");
}
void call()
{
// but this is not `int`
int result = libvlc_media_player_is_playing(player_ptr);
}
}
答案 0 :(得分:2)
vlc_media_player_is_playing
是指向函数的指针的别名,该函数返回一个整数并获取指向libvlc_media_player_t
struct的指针。
因此,对此类型的任何使用都被视为指向函数的指针,例如:
vlc_media_player_is_playing myFunc = SomeFuncReturningIntTakingVlc;
通过指针调用函数,例如:
int ret = (*myFunc)(libvlc_media_player_tParam);
但是你在这里创建了一个指向函数指针的指针:
vlc_media_player_is_playing* libvlc_media_player_is_playing = nullptr;
所以删除上面的指针运算符使它看起来像:
vlc_media_player_is_playing libvlc_media_player_is_playing = nullptr;
稍后在函数call
中调用该函数:
int result = (*libvlc_media_player_is_playing)(player_ptr);