2011-12-29 63 views
1

我試圖在SDL和我的C#.NET程序之間編組數據。第幾個電話,我讓到SDL.DLL做工精細,因爲我沒有錯誤,我的Windows控制檯應用程序不會打開一個空的應用程序窗口:使用PInvoke在'SDL.DLL'中找不到SDL_LoadBMP()入口點

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(),我得到這個運行時錯誤:

Unable to find an entry point named 'SDL_LoadBMP' in DLL 'SDL'.

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); 

假設是,函數執行確實存在於這個庫(SDL.DLL版本1.2.14)中,我是否使用了const char *的錯誤調用?

+1

你說曾幾次..你可以張貼..除非我沒有看到它的代碼..聽起來像任何一個問題與釋放封送的實例或一些你試圖打電話給我的方法,或者可能不是一個靜態的方法..但我願意猜測你沒有正確地釋放非託管資源.. – MethodMan 2011-12-29 19:12:15

+0

@DJ克拉澤 - 我修改了原來的問題包括工作電話。 – Buggieboy 2011-12-29 19:33:13

+0

很酷我也會和@ GalacticJello的回答我沒有想到嘗試在我自己的本地電話..好趕上它GalacticJello – MethodMan 2011-12-29 19:34:35

回答

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); 
} 

UPDATE

我不得不通過代碼來看看,呼叫你正在尋找被定義爲一個宏,所以這就是爲什麼你不能直接調用它。使用上面的代碼基本上做同樣的事情作爲宏確定指標:

#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1) 
+0

這很奇怪,因爲我建立並運行了Lazy Foo SDL課程,從這裏進行表面加載和blitting - http://lazyfoo.net/SDL_tutorials/lesson02/index.php - 它確實使SDL_LoadBMP調用。我的機器上有幾個SDL版本,並且從來不知道如何判斷Windows正在採用哪個版本的DLL。一個有一個名爲SDL_Image.DLL的dll。我想知道該功能是否在某個版本中移動了。 – Buggieboy 2011-12-29 19:43:13

+0

它實際上並不是一個導出的函數,但定義爲一個宏,這就是爲什麼你不能從C#調用它。 – GalacticJello 2011-12-29 19:59:44

+0

是的,你的帖子導致我搜索SDL標題,我也發現:#define SDL_LoadBMP(file)SDL_LoadBMP_RW(SDL_RWFromFile(file,「rb」),1)如上所述,很好的抓住! – Buggieboy 2011-12-29 20:03:33