找不到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*调用?

找不到SDL_LoadBMP()的入口点'段与PInvoke

我下载了您正在使用的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)