找不到SDL_LoadBMP()的入口点'段与PInvoke
本文关键字:PInvoke 段与 入口 SDL LoadBMP 找不到 | 更新日期: 2023-09-27 18:18:59
我正在尝试在SDL和我的c# . net程序之间编组数据。我进入dll的前几个调用工作得很好,因为我没有错误,我的Windows控制台应用程序确实打开了一个空的应用程序窗口:
My_SDL_Funcs.SDL_Init(0x0000FFFF); // SDL_INIT_EVERYTHING
IntPtr scrn = My_SDL_Funcs.SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, 0x00000000); // SDL_SWSURFACE
screen = (SDL_Surface)Marshal.PtrToStructure(scrn, typeof(SDL_Surface));
My_SDL_Funcs.SDL_WM_SetCaption("Hello World", null);
// ...
当我尝试调用SDL_LoadBMP()然而,我得到这个运行时错误:
无法在DLL 'SDL'中找到名为'SDL_LoadBMP'的入口点。
SDL文档说SDL_LoadBMP接受一个const char*文件名,并返回一个指向SDL_Surface结构体的指针。
我首先尝试将PInvoke声明为:
[DllImport("SDL", CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr SDL_LoadBMP([MarshalAs(UnmanagedType.LPWStr)] string file);
当这不起作用时,我尝试:
public static extern IntPtr SDL_LoadBMP(IntPtr file);
和使用:
IntPtr fn = Marshal.StringToHGlobalAnsi(filename);
IntPtr loadedImage = My_SDL_Funcs.SDL_LoadBMP(fn);
假设该函数实际上存在于此库(dll版本1.2.14),我是否使用了错误的const char*调用?
我下载了您正在使用的DLL版本,但无法找到SDL_LoadBMP的导出。
但是,这里有一个SDL_LoadBMP_RW,因此您可以像这样配置自己的helper调用:private const string SDL = "SDL.dll";
[DllImport(SDL, CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
public static extern IntPtr SDL_LoadBMP_RW(IntPtr src, int freesrc);
[DllImport(SDL, CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
public static extern IntPtr SDL_RWFromFile(string file, string mode);
public static IntPtr SDL_LoadBMP(string file)
{
return SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1);
}
:
我看了一下代码,你正在寻找的调用被定义为宏,所以这就是为什么你不能直接调用它。使用上面的代码基本上和宏定义做同样的事情:
#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1)