2016-09-04 58 views
2

按照documentation爲什麼SDL_GetWindowWMInfo()需要SDL版本?

SDL_bool SDL_GetWindowWMInfo(SDL_Window* window, 
          SDL_SysWMinfo* info) 

SDL_SysWMinfo* infoSDL_Version version構件必須在編譯時SDL_VERSION宏被傳遞之前被定義。

爲什麼SDL_GetWindowWMInfo要求SDL版本調用代碼對編譯?如果SDL_GetWindowWMInfo未檢查SDL版本,會發生什麼情況?

+0

視頻實現檢查,如果他們是同一SDL版本原調用一部分(例如['WIN_GetWindowWMInfo'](https://github.com/soulik/libsdl2/blob/1e51e5a6b046031302b00fddeafcac04ccd5926e/src/video/windows /SDL_windowswindow.c#L642),['X11_GetWindowWMInfo'](https://github.com/soulik/libsdl2/blob/1e51e5a6b046031302b00fddeafcac04ccd5926e/src/video/x11/SDL_x11window.c#L1412))。但我不確定這是爲什麼,因爲我從來沒有見過將這些實現隔離在單獨的二進制文件中。另外,我認爲'SDL_GetWindowWMInfo'可以自己做到這一點。 –

+2

如果SDL被更新(而不用重新編譯程序,只是一個動態庫)通過SysWMinfo(的SysWMinfo增加,因此工會的大小)與新的視頻實現及其自曝更多的數據 - 這呼叫將重踏記憶,因爲它會嘗試寫超過字節被分配。或者現有視頻系統的佈局發生變化。它似乎並沒有得到很好的保護,儘管我已經說過,儘管我已經看到了內存在野外跺腳,但它最多隻能填充信息結構。 – keltar

+0

爲什麼連接器不能捕獲這些東西? –

回答

1

它很像keltar賽義德。這是來自SDL_windowswindow.c:

SDL_bool 
WIN_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info) 
{ 
    const SDL_WindowData *data = (const SDL_WindowData *) window->driverdata; 
    if (info->version.major <= SDL_MAJOR_VERSION) { 
     info->subsystem = SDL_SYSWM_WINDOWS; 
     info->info.win.window = data->hwnd; 
     info->info.win.hdc = data->hdc; 
     return SDL_TRUE; 
    } else { 
     SDL_SetError("Application not compiled with SDL %d.%d\n", 
        SDL_MAJOR_VERSION, SDL_MINOR_VERSION); 
     return SDL_FALSE; 
    } 
} 

該函數填充用戶提供的結構體。危險在於,隨着SDL中的平臺支持更改(與實際功能/ API更改相比,新版本號中更明顯),此結構可能會發生更改。

如果結構定義了SDL的版本(比如,你可以使用更新的信息,但是舊的DLL)之間變化,這一要求使SDL它重踏程序的內存之前發現問題。