Move MFC supporting functions to minimfc (#77)

This commit is contained in:
Anders Jenbo 2025-05-14 02:27:34 +02:00 committed by GitHub
parent 0e2ea5edc4
commit d68142a8f2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 314 additions and 303 deletions

View File

@ -1,6 +1,7 @@
#include "detectdx5.h"
#ifdef MINIWIN
#include "minimfc.h"
#include "miniwin_ddraw.h"
#include "miniwin_dinput.h"
#else

View File

@ -2,6 +2,85 @@
#include "miniwin.h"
#include <assert.h>
#include <stdarg.h>
#include <stdio.h>
// --- Defines and Macros ---
// Remove WinAPI stuff
#define BEGIN_MESSAGE_MAP(class_name, base_class_name)
#define DECLARE_MESSAGE_MAP()
#ifndef __cdecl
#define __cdecl
#endif
#define END_MESSAGE_MAP()
#define ON_COMMAND(id, func)
#define ON_LBN_SELCHANGE(id, func)
#define ON_WM_DESTROY()
#define ON_WM_PAINT()
#define ON_WM_QUERYDRAGICON()
#define ON_WM_SYSCOMMAND()
#define FAILED(hr) (((HRESULT) (hr)) < 0)
#define InterlockedIncrement(x) __sync_add_and_fetch(x, 1)
#define INVALID_HANDLE ((HANDLE) -1)
#define INVALID_HANDLE_VALUE ((HANDLE) -1)
#define HKEY_LOCAL_MACHINE ((HKEY) 0x80000002)
#define LOWORD(l) ((WORD) (((DWORD_PTR) (l)) & 0xffff))
#define MAKEINTRESOURCE(i) (reinterpret_cast<LPCTSTR>((ULONG_PTR) ((WORD) (i))))
#define ICON_BIG 1
#define ICON_SMALL 0
#define KEY_READ 0x20019
#define KEY_WRITE 0x20006
#define LB_ADDSTRING 0x180
#define LB_GETCURSEL 0x0188
#define LB_SETCURSEL 0x185
#define MF_SEPARATOR 0x80000000
#define MF_STRING 0x00000000
#define SM_CXICON 11
#define SM_CYICON 12
#define WM_ICONERASEBKGND 0x0027
#define WM_SETICON 0x804
#define ERROR_SUCCESS 0
#define GENERIC_READ 0x80000000L
#define OPEN_EXISTING 3
#define REG_SZ 1
#define RT_GROUP_ICON 0x00000007
#define SW_RESTORE 9
// --- Typedefs ---
typedef char CHAR;
typedef BYTE* LPBYTE;
typedef char* LPTSTR;
typedef const char* LPCTSTR;
typedef intptr_t INT_PTR, *PINT_PTR;
typedef uintptr_t UINT_PTR, *PUINT_PTR;
typedef intptr_t LONG_PTR, *PLONG_PTR;
typedef uintptr_t ULONG_PTR, *PULONG_PTR;
typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;
typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM, LRESULT;
typedef HKEY* PHKEY;
typedef BITMAPINFO* LPBITMAPINFO;
typedef GUID REFIID;
// --- Structs ---
struct OSVERSIONINFOA {
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformId;
};
typedef struct IUnknown* LPUNKNOWN;
struct CWnd {
void* m_hWnd;
void EnableWindow(bool bEnable) {}
@ -56,10 +135,181 @@ struct CWinApp {
virtual int ExitInstance();
};
struct MEMORYSTATUS {
DWORD dwLength;
DWORD dwTotalPhys;
};
struct CCommandLineInfo {
virtual void ParseParam(LPCSTR pszParam, BOOL bFlag, BOOL bLast) {}
};
// --- Classs ---
class CString {
public:
CString(const char* str = "") : m_str(str) {}
void LoadString(int str) {}
operator const char*() const { return m_str; }
private:
const char* m_str;
};
// --- Functions ---
inline WINBOOL WINAPI SetForegroundWindow(HWND hWnd)
{
return TRUE;
}
inline BOOL ShowWindow(HWND hWnd, int nCmdShow)
{
return TRUE;
}
inline BOOL SetWindowPos(HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags)
{
return TRUE;
}
BOOL GetWindowRect(HWND hDlg, struct RECT* Rect);
inline BOOL GetClientRect(LPRECT lpRect)
{
return TRUE;
}
inline BOOL IsIconic()
{
return FALSE;
}
inline int GetSystemMetrics(int nIndex)
{
return 0;
}
inline BOOL GetVersionEx(OSVERSIONINFOA* version)
{
return TRUE;
}
void GlobalMemoryStatus(MEMORYSTATUS* memory_status);
inline BOOL DrawIcon(HDC hdc, int x, int y, HICON hIcon)
{
return TRUE;
}
inline bool AppendMenu(void* menu, UINT uFlags, UINT_PTR uIDNewItem, LPCTSTR lpszNewItem)
{
return true;
}
inline LSTATUS RegOpenKeyEx(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
{
return ERROR_SUCCESS;
}
inline LSTATUS RegQueryValueEx(
HKEY hKey,
LPCSTR lpValueName,
LPDWORD lpReserved,
LPDWORD lpType,
BYTE* lpData,
LPDWORD lpcbData
)
{
return ERROR_SUCCESS;
}
inline LSTATUS RegCloseKey(HKEY hKey)
{
return ERROR_SUCCESS;
}
inline LSTATUS RegSetValueEx(
HKEY hKey,
LPCSTR lpValueName,
DWORD Reserved,
DWORD dwType,
const BYTE* lpData,
DWORD cbData
)
{
return ERROR_SUCCESS;
}
inline LSTATUS RegCreateKeyEx(
HKEY hKey,
LPCSTR lpSubKey,
DWORD Reserved,
const char* lpClass,
DWORD dwOptions,
REGSAM samDesired,
void* lpSecurityAttributes,
PHKEY phkResult,
LPDWORD lpdwDisposition
)
{
return ERROR_SUCCESS;
}
void OutputDebugString(const char* lpOutputString);
inline void* GetProcAddress(HMODULE module, const char* name)
{
return 0;
}
int miniwin_stricmp(const char* str1, const char* str2);
#define _stricmp miniwin_stricmp
inline HICON LoadIcon(HINSTANCE hInstance, LPCSTR lpIconName)
{
return 0;
}
inline int lstrcmpi(LPCSTR lpString1, LPCSTR lpString2)
{
return 0;
}
inline HINSTANCE AfxFindResourceHandle(LPCTSTR lpszResourceName, int lpszResourceType)
{
return 0;
}
inline HMODULE LoadLibrary(const char* name)
{
return 0;
}
inline int FreeLibrary(void* hModule)
{
return 0;
}
inline HMENU GetSystemMenu(HWND hWnd, bool bRevert)
{
assert(false && "Needs implementation");
return reinterpret_cast<HMENU>(0x1234);
}
inline HWND WINAPI FindWindow(LPCSTR lpClassName, LPCSTR lpWindowName)
{
return 0;
}
inline LRESULT SendMessage(UINT Msg, WPARAM wParam, LPARAM lParam)
{
return 0;
}
inline LRESULT SendMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
return 0;
}
inline BOOL IsDlgButtonChecked(int nIDButton)
{
return 0;

View File

@ -5,6 +5,7 @@
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#include <stdlib.h>
#include <vector>
char* afxCurrentAppName;
AFX_MODULE_STATE g_CustomModuleState;
@ -97,3 +98,57 @@ void AfxMessageBox(const char* message)
{
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, title, message, NULL);
}
static std::vector<std::pair<SDL_Window*, HWND>> sdl_hwnd_mapping;
SDL_Window* miniwin_GetSdlWindow(HWND hWnd)
{
for (size_t i = 0; i < sdl_hwnd_mapping.size(); i++) {
if (sdl_hwnd_mapping[i].second == hWnd) {
return sdl_hwnd_mapping[i].first;
}
}
return NULL;
}
BOOL GetWindowRect(HWND hWnd, RECT* Rect)
{
int x, y, w, h;
if (!Rect) {
return FALSE;
}
SDL_Window* window = miniwin_GetSdlWindow(hWnd);
if (window == NULL) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unregistered HWND %p", hWnd);
Rect->left = 0;
Rect->top = 0;
Rect->right = 640;
Rect->bottom = 480;
return FALSE;
}
SDL_GetWindowPosition(window, &x, &y);
SDL_GetWindowSize(window, &w, &h);
Rect->right = x;
Rect->top = y;
Rect->left = w + x;
Rect->bottom = h + y;
return TRUE;
}
void OutputDebugString(const char* lpOutputString)
{
SDL_LogDebug(SDL_LOG_CATEGORY_APPLICATION, "%s", lpOutputString);
}
int miniwin_stricmp(const char* str1, const char* str2)
{
return SDL_strcasecmp(str1, str2);
}
void GlobalMemoryStatus(MEMORYSTATUS* memory_status)
{
memory_status->dwLength = sizeof(*memory_status);
memory_status->dwTotalPhys = 1024 * SDL_GetSystemRAM();
}

View File

@ -1,16 +1,10 @@
#pragma once
#include <assert.h>
#include <limits.h>
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
// --- Defines and Macros ---
#define RASTERCAPS 0x00000000
#define RC_PALETTE 0x00000000
#define SIZEPALETTE 256
#define MAKE_HRESULT(sev, fac, code) \
((HRESULT) (((uint32_t) (sev) << 31) | ((uint32_t) (fac) << 16) | ((uint32_t) (code))))
@ -19,31 +13,10 @@
const GUID GuidName = {l, w1, w2, b1 + b2 + b3 + b4 + b5 + b6 + b7 + b8}
// Remove WinAPI stuff
#define BEGIN_MESSAGE_MAP(class_name, base_class_name)
#define DECLARE_MESSAGE_MAP()
#define CALLBACK
#ifndef __cdecl
#define __cdecl
#endif
#define FAR
#define END_MESSAGE_MAP()
#define ON_COMMAND(id, func)
#define ON_LBN_SELCHANGE(id, func)
#define ON_WM_DESTROY()
#define ON_WM_PAINT()
#define ON_WM_QUERYDRAGICON()
#define ON_WM_SYSCOMMAND()
#define WINAPI
#define FAILED(hr) (((HRESULT) (hr)) < 0)
#define InterlockedIncrement(x) __sync_add_and_fetch(x, 1)
#define INVALID_HANDLE ((HANDLE) -1)
#define INVALID_HANDLE_VALUE ((HANDLE) -1)
#define HKEY_LOCAL_MACHINE ((HKEY) 0x80000002)
#define GWL_STYLE (-16)
#define HWND_NOTOPMOST (HWND) - 2
#define LOWORD(l) ((WORD) (((DWORD_PTR) (l)) & 0xffff))
#define MAKEINTRESOURCE(i) (reinterpret_cast<LPCTSTR>((ULONG_PTR) ((WORD) (i))))
#define RGB(r, g, b) ((r) | ((g) << 8) | ((b) << 16))
#define S_OK ((HRESULT) 0)
#define E_NOINTERFACE (0x80004002)
@ -51,30 +24,12 @@
#define TRUE 1
#define FALSE 0
#define ICON_BIG 1
#define ICON_SMALL 0
#define KEY_READ 0x20019
#define KEY_WRITE 0x20006
#define LB_ADDSTRING 0x180
#define LB_GETCURSEL 0x0188
#define LB_SETCURSEL 0x185
#define MF_SEPARATOR 0x80000000
#define MF_STRING 0x00000000
#define SM_CXICON 11
#define SM_CYICON 12
#define SWP_NOACTIVATE 0x0010
#define SWP_NOMOVE 0x0002
#define SWP_NOSIZE 0x0004
#define SWP_NOZORDER 0x0001
#define WM_CLOSE 0x0010
#define WM_ICONERASEBKGND 0x0027
#define WM_SETICON 0x804
#define WM_QUIT 0x0012
#define WM_TIMER 0x0113
@ -84,30 +39,27 @@
#define WS_SYSMENU 0x00080000L
#define WS_THICKFRAME 0x00040000L
#define GWL_STYLE (-16)
#define GWL_EXSTYLE -20
#define ANSI_CHARSET 0
#define BI_RGB 0
#define CLIP_DEFAULT_PRECIS 0
#define DEFAULT_QUALITY 0
#define ERROR_SUCCESS 0
#define ETO_OPAQUE 0x0002
#define FF_DONTCARE 0x00000000
#define RASTERCAPS 0x00000000
#define RC_PALETTE 0x00000000
#define SIZEPALETTE 256
#define FW_NORMAL 400
#define GENERIC_READ 0x80000000L
#define GWL_EXSTYLE -20
#define OPAQUE 2
#define OPEN_EXISTING 3
#define OUT_DEFAULT_PRECIS 0
#define RDW_FRAME 0x0400
#define REG_SZ 1
#define RT_GROUP_ICON 0x00000007
#define SRCCOPY 0x00CC0020
#define SW_RESTORE 9
#define VARIABLE_PITCH 2
// --- Typedefs ---
typedef char CHAR;
typedef uint8_t BYTE, byte;
typedef BYTE* LPBYTE;
typedef int32_t LONG;
typedef uint32_t ULONG, DWORD;
typedef DWORD* LPDWORD;
@ -117,22 +69,12 @@ typedef unsigned short WORD;
typedef long* LPLONG;
typedef void* LPVOID;
typedef char* LPSTR;
typedef char* LPTSTR;
typedef const char* LPCTSTR;
typedef const char* LPCSTR;
typedef intptr_t INT_PTR, *PINT_PTR;
typedef uintptr_t UINT_PTR, *PUINT_PTR;
typedef intptr_t LONG_PTR, *PLONG_PTR;
typedef uintptr_t ULONG_PTR, *PULONG_PTR;
typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;
typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM, LRESULT;
typedef void* HANDLE;
typedef HANDLE HMENU, HICON, HFONT;
typedef struct HINSTANCE__* HINSTANCE;
typedef HANDLE HWND, HMODULE, HDC, HPALETTE, HFILE, HCURSOR;
typedef LONG HRESULT, LSTATUS, HKEY, REGSAM;
typedef HKEY* PHKEY;
// --- Structs ---
struct tagPOINT {
@ -146,14 +88,13 @@ struct SIZE {
LONG cy;
};
struct tagRECT {
struct RECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
};
typedef tagRECT RECT;
typedef tagRECT* LPRECT;
typedef RECT* LPRECT;
struct BITMAPINFOHEADER {
DWORD biSize;
@ -185,7 +126,6 @@ struct BITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
};
typedef BITMAPINFO* LPBITMAPINFO;
struct PALETTEENTRY {
BYTE peRed;
@ -201,7 +141,6 @@ struct GUID {
int m_data3;
int m_data4;
};
typedef GUID REFIID;
typedef GUID* LPGUID;
struct IUnknown {
@ -214,8 +153,6 @@ struct IUnknown {
private:
int m_refCount;
};
typedef struct IUnknown* LPUNKNOWN;
struct LOGPALETTE {
WORD palVersion;
WORD palNumEntries;
@ -223,79 +160,16 @@ struct LOGPALETTE {
};
typedef LOGPALETTE* LPLOGPALETTE;
struct MEMORYSTATUS {
DWORD dwLength;
DWORD dwTotalPhys;
};
struct OSVERSIONINFOA {
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformId;
};
// --- Classs ---
class CString {
public:
CString(const char* str = "") : m_str(str) {}
void LoadString(int str) {}
operator const char*() const { return m_str; }
private:
const char* m_str;
};
// --- Functions ---
inline WINBOOL WINAPI SetForegroundWindow(HWND hWnd)
{
return TRUE;
}
inline BOOL ShowWindow(HWND hWnd, int nCmdShow)
{
return TRUE;
}
inline BOOL SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags)
{
return TRUE;
}
inline BOOL SetWindowPos(HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags)
{
return TRUE;
}
BOOL GetWindowRect(HWND hDlg, struct tagRECT* Rect);
inline BOOL GetClientRect(LPRECT lpRect)
{
return TRUE;
}
inline BOOL IsIconic()
{
return FALSE;
}
inline int GetSystemMetrics(int nIndex)
{
return 0;
}
inline UINT WINAPI GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LPPALETTEENTRY pPalEntries)
{
return 0;
}
inline BOOL GetVersionEx(OSVERSIONINFOA* version)
{
return TRUE;
}
void GlobalMemoryStatus(MEMORYSTATUS* memory_status);
inline HDC WINAPI GetDC(HWND hWnd)
{
return 0;
@ -331,11 +205,6 @@ inline int SetTextColor(HDC hdc, int color)
return color;
}
inline BOOL DrawIcon(HDC hdc, int x, int y, HICON hIcon)
{
return TRUE;
}
inline static BOOL GetTextExtentPoint(HDC hdc, LPCSTR lpString, int c, SIZE* psizl)
{
if (psizl) {
@ -380,11 +249,6 @@ inline int GetTextExtentPoint32(HDC hdc, LPCSTR str, int len, SIZE* out)
return GetTextExtentPoint(hdc, str, len, out);
}
inline bool AppendMenu(void* menu, UINT uFlags, UINT_PTR uIDNewItem, LPCTSTR lpszNewItem)
{
return true;
}
inline HMENU GetMenu(HWND hWnd)
{
return NULL;
@ -395,62 +259,6 @@ inline int DrawMenuBar(void* hWnd)
return 1;
}
inline LSTATUS RegOpenKeyEx(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
{
return ERROR_SUCCESS;
}
inline LSTATUS RegQueryValueEx(
HKEY hKey,
LPCSTR lpValueName,
LPDWORD lpReserved,
LPDWORD lpType,
BYTE* lpData,
LPDWORD lpcbData
)
{
return ERROR_SUCCESS;
}
inline LSTATUS RegCloseKey(HKEY hKey)
{
return ERROR_SUCCESS;
}
inline LSTATUS RegSetValueEx(
HKEY hKey,
LPCSTR lpValueName,
DWORD Reserved,
DWORD dwType,
const BYTE* lpData,
DWORD cbData
)
{
return ERROR_SUCCESS;
}
inline LSTATUS RegCreateKeyEx(
HKEY hKey,
LPCSTR lpSubKey,
DWORD Reserved,
const char* lpClass,
DWORD dwOptions,
REGSAM samDesired,
void* lpSecurityAttributes,
PHKEY phkResult,
LPDWORD lpdwDisposition
)
{
return ERROR_SUCCESS;
}
void OutputDebugString(const char* lpOutputString);
inline void* GetProcAddress(HMODULE module, const char* name)
{
return 0;
}
inline static int StretchDIBits(
void* hdc,
int xDest,
@ -485,19 +293,11 @@ inline int DeleteObject(void*)
return 1;
}
int miniwin_stricmp(const char* str1, const char* str2);
#define _stricmp miniwin_stricmp
inline BOOL AdjustWindowRectEx(LPRECT lpRect, DWORD dwStyle, BOOL bMenu, DWORD dwExStyle)
{
return TRUE;
}
inline HICON LoadIcon(HINSTANCE hInstance, LPCSTR lpIconName)
{
return 0;
}
inline int SetRect(RECT* rc, int left, int top, int right, int bottom)
{
rc->left = left;
@ -507,49 +307,8 @@ inline int SetRect(RECT* rc, int left, int top, int right, int bottom)
return 1;
}
inline int lstrcmpi(LPCSTR lpString1, LPCSTR lpString2)
{
return 0;
}
inline HINSTANCE AfxFindResourceHandle(LPCTSTR lpszResourceName, int lpszResourceType)
{
return 0;
}
inline HMODULE LoadLibrary(const char* name)
{
return 0;
}
inline int FreeLibrary(void* hModule)
{
return 0;
}
inline HMENU GetSystemMenu(HWND hWnd, bool bRevert)
{
assert(false && "Needs implementation");
return reinterpret_cast<HMENU>(0x1234);
}
VOID WINAPI Sleep(DWORD dwMilliseconds);
inline HWND WINAPI FindWindow(LPCSTR lpClassName, LPCSTR lpWindowName)
{
return 0;
}
inline LRESULT SendMessage(UINT Msg, WPARAM wParam, LPARAM lParam)
{
return 0;
}
inline LRESULT SendMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
return 0;
}
inline HPALETTE CreatePalette(LPLOGPALETTE lpLogPalette)
{
return nullptr;

View File

@ -25,61 +25,7 @@ HRESULT IUnknown::QueryInterface(const GUID& riid, void** ppvObject)
return E_NOINTERFACE;
}
static std::vector<std::pair<SDL_Window*, HWND>> sdl_hwnd_mapping;
SDL_Window* miniwin_GetSdlWindow(HWND hWnd)
{
for (size_t i = 0; i < sdl_hwnd_mapping.size(); i++) {
if (sdl_hwnd_mapping[i].second == hWnd) {
return sdl_hwnd_mapping[i].first;
}
}
return NULL;
}
void OutputDebugString(const char* lpOutputString)
{
SDL_LogDebug(SDL_LOG_CATEGORY_APPLICATION, "%s", lpOutputString);
}
VOID WINAPI Sleep(DWORD dwMilliseconds)
{
SDL_Delay(dwMilliseconds);
}
BOOL GetWindowRect(HWND hWnd, tagRECT* Rect)
{
int x, y, w, h;
if (!Rect) {
return FALSE;
}
SDL_Window* window = miniwin_GetSdlWindow(hWnd);
if (window == NULL) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unregistered HWND %p", hWnd);
Rect->left = 0;
Rect->top = 0;
Rect->right = 640;
Rect->bottom = 480;
return FALSE;
}
SDL_GetWindowPosition(window, &x, &y);
SDL_GetWindowSize(window, &w, &h);
Rect->right = x;
Rect->top = y;
Rect->left = w + x;
Rect->bottom = h + y;
return TRUE;
}
int miniwin_stricmp(const char* str1, const char* str2)
{
return SDL_strcasecmp(str1, str2);
}
void GlobalMemoryStatus(MEMORYSTATUS* memory_status)
{
memory_status->dwLength = sizeof(*memory_status);
memory_status->dwTotalPhys = 1024 * SDL_GetSystemRAM();
}