我正在尝试在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 *调用?
答案 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)