导出函数,通过 DLL 转换为指针
Exporting a function, cast into a pointer through a DLL
这是对之前问题的详细说明:
还有一个类似的问题,但我的答案与我的问题不符,我想举一些例子:Exporting a function pointer from dll
我有两组代码,我希望它们能做同样的事情,但后者崩溃了。
使用 mingw32 和 Win7.
要导出的函数。这被认为是遗留的和不可改变的。
addxy.c
int addXY(int x, int y)
{
return x + y;
}
addxy.h
int addXY(int x, int y);
工作示例
main.c
#include <stdio.h>
#include "addxy.h"
typedef int (__cdecl *addXYWrap_t)(int a, int b);
addXYWrap_t addXYWrap = (addXYWrap_t)addXY;
void main()
{
printf("result: %d", addXYWrap(3, 4));
}
屈服
result: 7
崩溃的例子
addxydll.c
#include <stdio.h>
#include "addxy.h"
typedef int (__cdecl *addXYWrap_t)(int a, int b);
__declspec(dllexport) addXYWrap_t addXYWrap = (addXYWrap_t)addXY;
main.c
#include <windows.h>
#include <stdio.h>
typedef int (__cdecl *func)(int a, int b);
void main()
{
HINSTANCE loadedDLL = LoadLibrary("addxy.dll");
if(!loadedDLL) {
printf("DLL not loaded");
return;
} else {
printf("DLL loaded\n");
}
func addition = (func)GetProcAddress(loadedDLL, "addXYWrap");
if(!addition) {
printf("Func not loaded");
return;
} else {
printf("Func loaded\n");
}
printf("result: %d", addition(3, 4));
}
屈服
DLL loaded
Func loaded
在崩溃之前。
崩溃没有提供有关原因或内容的信息。
是语法错误还是概念错误?
int addXY(int x, int y)
{
return x + y;
}
__declspec(dllexport) addXYWrap_t addXYWrap = (addXYWrap_t)addXY;
这是一个错误。您必须导出函数,而不是全局指针。也就是说,
/* addxy.c */
__declspec(dllexport) int addXY(int x, int y)
{
return x + y;
}
....
/* main.c */
func addition = (func)GetProcAddress(loadedDLL, "_addXY");
func addition = (func)GetProcAddress(loadedDLL, "addXYWrap");
此调用 GetProcAddress
returns addXYWrap
的 地址,而不是它的值。由于 addXYWrap
是一个函数指针(与 func
类型相同),这意味着它 returns 是一个指向函数指针的指针,或者 func*
.
尝试将该行更改为:
func addition = *(func*)GetProcAddress(loadedDLL, "addXYWrap");
或者,或者:
func* addition = (func*)GetProcAddress(loadedDLL, "addXYWrap");
然后是(*addition)(3, 4)
因此,根据以上评论,您似乎想多了。如果您 需要 一个函数指针,那么要正确调用它,您必须首先取消引用 GetProcAddress
,如下所示:
func addition = *(func*)GetProcAddress(loadedDLL, "addXYWrap");
但是,更方便的解决方案是只包装函数:
__declspec(dllexport) int myAddXY(int x, int y)
{
return addXY(x, y);
}
这是对之前问题的详细说明:
还有一个类似的问题,但我的答案与我的问题不符,我想举一些例子:Exporting a function pointer from dll
我有两组代码,我希望它们能做同样的事情,但后者崩溃了。 使用 mingw32 和 Win7.
要导出的函数。这被认为是遗留的和不可改变的。
addxy.c
int addXY(int x, int y)
{
return x + y;
}
addxy.h
int addXY(int x, int y);
工作示例
main.c
#include <stdio.h>
#include "addxy.h"
typedef int (__cdecl *addXYWrap_t)(int a, int b);
addXYWrap_t addXYWrap = (addXYWrap_t)addXY;
void main()
{
printf("result: %d", addXYWrap(3, 4));
}
屈服
result: 7
崩溃的例子
addxydll.c
#include <stdio.h>
#include "addxy.h"
typedef int (__cdecl *addXYWrap_t)(int a, int b);
__declspec(dllexport) addXYWrap_t addXYWrap = (addXYWrap_t)addXY;
main.c
#include <windows.h>
#include <stdio.h>
typedef int (__cdecl *func)(int a, int b);
void main()
{
HINSTANCE loadedDLL = LoadLibrary("addxy.dll");
if(!loadedDLL) {
printf("DLL not loaded");
return;
} else {
printf("DLL loaded\n");
}
func addition = (func)GetProcAddress(loadedDLL, "addXYWrap");
if(!addition) {
printf("Func not loaded");
return;
} else {
printf("Func loaded\n");
}
printf("result: %d", addition(3, 4));
}
屈服
DLL loaded
Func loaded
在崩溃之前。
崩溃没有提供有关原因或内容的信息。
是语法错误还是概念错误?
int addXY(int x, int y)
{
return x + y;
}
__declspec(dllexport) addXYWrap_t addXYWrap = (addXYWrap_t)addXY;
这是一个错误。您必须导出函数,而不是全局指针。也就是说,
/* addxy.c */
__declspec(dllexport) int addXY(int x, int y)
{
return x + y;
}
....
/* main.c */
func addition = (func)GetProcAddress(loadedDLL, "_addXY");
func addition = (func)GetProcAddress(loadedDLL, "addXYWrap");
此调用 GetProcAddress
returns addXYWrap
的 地址,而不是它的值。由于 addXYWrap
是一个函数指针(与 func
类型相同),这意味着它 returns 是一个指向函数指针的指针,或者 func*
.
尝试将该行更改为:
func addition = *(func*)GetProcAddress(loadedDLL, "addXYWrap");
或者,或者:
func* addition = (func*)GetProcAddress(loadedDLL, "addXYWrap");
然后是(*addition)(3, 4)
因此,根据以上评论,您似乎想多了。如果您 需要 一个函数指针,那么要正确调用它,您必须首先取消引用 GetProcAddress
,如下所示:
func addition = *(func*)GetProcAddress(loadedDLL, "addXYWrap");
但是,更方便的解决方案是只包装函数:
__declspec(dllexport) int myAddXY(int x, int y)
{
return addXY(x, y);
}