使用PInvoke在“SDL.DLL”中找不到SDL_LoadBMP()入口点

时间:2011-12-29 19:01:03

标签: c# dll pinvoke sdl

我正在尝试在SDL和我的C#.NET程序之间编组数据。我在SDL.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 doc说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);

假设函数actuall确实存在于此库(SDL.DLL版本1.2.14)中,我是否使用了错误的const char *调用?

1 个答案:

答案 0 :(得分:2)

我下载了您正在使用的DLL版本,但找不到SDL_LoadBMP的导出。

但是有一个SDL_LoadBMP_RW,所以你可以这样安装你自己的帮助器调用:

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)