2011-12-29 2 views
1

SDL과 C# .NET 프로그램간에 데이터를 마샬링하려고합니다. 나는 오류를 얻을하고 내 Windows 콘솔 응용 프로그램 빈 응용 프로그램 창을 열고처럼 진대 내가 SDL.DLL 잘 작동으로 만들 처음 몇 전화 : I 그러나) SDL_LoadBMP을 (를 호출 할 때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); 
// ... 

을, I 이 런타임 오류가 발생합니다 :

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

SDL의 문서는 SDL_LoadBMP는 const를 숯불 * 파일 이름을 사용하고 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

당신은 내가 그것을보고 있지 않다 않는 몇 번 .. 당신이 .. 것을 게시 할 수있는 일 밝혔다 코드가 .. 중 문제 같은 소리 : 위의 코드를 사용하면 기본적으로 매크로 (고화질)로 같은 일을 마샬링 된 인스턴스 또는 내 메소드를 호출하려고하는 메소드 또는 정적 메소드가 아닐 수도있는 메소드를 해제하는 중입니다.하지만 관리되지 않는 리소스를 적절하게 해제하지는 않을 것입니다. – MethodMan

+0

@DJ KRAZE - 원래 질문을 수정했습니다. 근무 통화가 포함됩니다. – Buggieboy

+0

시원함 나는 또한 @ GalacticJello의 대답과 함께 갈 것입니다. 나는 내 자신의 지역에서 전화를 시도하지 않았다고 생각합니다. 좋은 걸 the GalacticJello – MethodMan

답변

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

게으른 푸 SDL 레슨을 작성하고 실행했기 때문에 이상하게 보입니다. - http://lazyfoo.net/SDL_tutorials/lesson02/index.php - SDL_LoadBMP 호출을 확실히합니다. 내 컴퓨터에 여러 개의 SDL 버전이 있고 어떤 DLL 버전의 Windows가 실행되는지 알 수있는 방법을 결코 이해할 수 없습니다. 하나는 SDL_Image.DLL이라는 DLL이 있습니다. 함수가 일부 버전으로 옮겨 졌는지 궁금합니다. – Buggieboy

+0

실제로는 내 보낸 함수가 아니지만 매크로로 정의되었으므로 C#에서 호출 할 수 없습니다. – GalacticJello

+0

네 게시물 덕분에 SDL 헤더를 검색하게되었는데 #define SDL_LoadBMP (file) SDL_LoadBMP_RW (SDL_RWFromFile (file, "rb"), 1) – Buggieboy

관련 문제