c++ - C++ 中的函数指针和未知数量的参数

标签 c++ dll function-pointers loadlibrary

我遇到了以下奇怪的代码块。假设您有以下 typedef:

typedef int (*MyFunctionPointer)(int param_1, int param_2);

然后,在一个函数中,我们试图通过以下方式从 DLL 运行一个函数:

LPCWSTR DllFileName;    //Path to the dll stored here
LPCSTR _FunctionName;   // (mangled) name of the function I want to test

MyFunctionPointer functionPointer;

HINSTANCE hInstLibrary = LoadLibrary( DllFileName );
FARPROC functionAddress = GetProcAddress( hInstLibrary, _FunctionName );

functionPointer = (MyFunctionPointer) functionAddress;

//The values are arbitrary
int a = 5;
int b = 10;
int result = 0;

result = functionPointer( a, b );  //Possible error?

问题是,没有任何方法可以知道我们通过 LoadLibrary 获得的地址的函数是否采用两个整数参数。dll 名称由用户在运行时提供,然后列出导出函数的名称然后用户选择要测试的(同样,在运行时 :S:S )。 那么,通过最后一行中的函数调用,我们不是为可能的堆栈损坏打开了大门吗?我知道这可以编译,但是如果我们将错误的参数传递给我们指向的函数,会发生什么样的运行时错误?

最佳答案

如果预期和使用的参数数量或类型以及调用约定不同,我可以想到三个错误:

  • 如果调用约定不同,将读取错误的参数值
  • 如果函数实际上需要比给定更多的参数,随机值将用作参数(如果涉及指针,我会让你想象后果)
  • 在任何情况下,返回地址都是垃圾,因此函数返回后将立即运行带有随机数据的随机代码。

两个词:未定义的行为

关于c++ - C++ 中的函数指针和未知数量的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2380185/

相关文章:

c++ - 初始化期间运行时类方法替换

c++ - 在几乎相同的结构之间传递成员值

c++ - 如何用C语言制作棋盘?

c# - 在 C++Builder 应用程序中动态加载 C# .NET 程序集

c++ - 为什么重载函数的函数指针需要static_cast?

c++ - 指向成员表示的指针

C++:如何正确堆叠 for 循环迭代

c++ - 将结构 append 到链表

c++ - 跨平台动态链接(Windows 到 Linux)

c# - 调试 Matlab 中使用的 DLL