Current News
Archived News
Search News
Discussion Forum


Old Forum
Install Programs More Downloads...
Troubleshooting
Source Code
Format Specs.
Misc. Information
Non-SF Stuff
Links




1 /* License information for this code is in license.txt */
3 // Code for loading SFmpqapi at run-time
5 // Comment out the next line to load SFmpqapi at the
6 // start of your program, rather that when it is first
7 // used.
8 #define SFMPQAPI_DELAY_LOAD
10 #include "SFmpqapi_no-lib.h"
12 struct SFMPQAPI_DELAY_LOADER {
13 #ifndef SFMPQAPI_DELAY_LOAD
14         SFMPQAPI_DELAY_LOADER();
15 #endif
16         ~SFMPQAPI_DELAY_LOADER();
17 } SFMpqApi_Delay_Loader;
19 HINSTANCE hSFMpq = 0;
21 void LoadSFMpqDll();
23 void LoadSFMpqDll()
24 {
25         if (!hSFMpq) hSFMpq = LoadLibrary("SFmpq.dll");
26 }
28 BOOL WINAPI MpqInitialize_stub()
29 {
30         LoadSFMpqDll();
31         if (hSFMpq) {
32                 *(FARPROC *)&MpqInitialize = GetProcAddress(hSFMpq,"MpqInitialize");
33                 if (MpqInitialize) return MpqInitialize();
34         }
35         return FALSE;
36 }
38 LPCSTR WINAPI MpqGetVersionString_stub()
39 {
40         LoadSFMpqDll();
41         if (hSFMpq) {
42                 *(FARPROC *)&MpqGetVersionString = GetProcAddress(hSFMpq,"MpqGetVersionString");
43                 if (MpqGetVersionString) return MpqGetVersionString();
44         }
45         return 0;
46 }
48 float WINAPI MpqGetVersion_stub()
49 {
50         LoadSFMpqDll();
51         if (hSFMpq) {
52                 *(FARPROC *)&MpqGetVersion = GetProcAddress(hSFMpq,"MpqGetVersion");
53                 if (MpqGetVersion) return MpqGetVersion();
54         }
55         return 0;
56 }
58 void WINAPI SFMpqDestroy_stub()
59 {
60         LoadSFMpqDll();
61         if (hSFMpq) {
62                 *(FARPROC *)&SFMpqDestroy = GetProcAddress(hSFMpq,"SFMpqDestroy");
63                 if (SFMpqDestroy) SFMpqDestroy();
64         }
65 }
67 void WINAPI AboutSFMpq_stub()
68 {
69         LoadSFMpqDll();
70         if (hSFMpq) {
71                 *(FARPROC *)&AboutSFMpq = GetProcAddress(hSFMpq,"AboutSFMpq");
72                 if (AboutSFMpq) AboutSFMpq();
73         }
74 }
76 LPCSTR WINAPI SFMpqGetVersionString_stub()
77 {
78         LoadSFMpqDll();
79         if (hSFMpq) {
80                 *(FARPROC *)&SFMpqGetVersionString = GetProcAddress(hSFMpq,"SFMpqGetVersionString");
81                 if (SFMpqGetVersionString) return SFMpqGetVersionString();
82         }
83         return 0;
84 }
86 DWORD WINAPI SFMpqGetVersionString2_stub(LPCSTR lpBuffer, DWORD dwBufferLength)
87 {
88         LoadSFMpqDll();
89         if (hSFMpq) {
90                 *(FARPROC *)&SFMpqGetVersionString2 = GetProcAddress(hSFMpq,"SFMpqGetVersionString2");
91                 if (SFMpqGetVersionString2) return SFMpqGetVersionString2(lpBuffer,dwBufferLength);
92         }
93         return 0;
94 }
96 SFMPQVERSION WINAPI SFMpqGetVersion_stub()
97 {
98         LoadSFMpqDll();
99         if (hSFMpq) {
100                 *(FARPROC *)&SFMpqGetVersion = GetProcAddress(hSFMpq,"SFMpqGetVersion");
101                 if (SFMpqGetVersion) return SFMpqGetVersion();
102         }
103         SFMPQVERSION NoVersionData = {0,0,0,0};
104         return NoVersionData;
107 BOOL WINAPI SFileOpenArchive_stub(LPCSTR lpFileName, DWORD dwPriority, DWORD dwFlags, MPQHANDLE *hMPQ)
109         LoadSFMpqDll();
110         if (hSFMpq) {
111                 *(FARPROC *)&SFileOpenArchive = GetProcAddress(hSFMpq,"SFileOpenArchive");
112                 if (SFileOpenArchive) return SFileOpenArchive(lpFileName,dwPriority,dwFlags,hMPQ);
113         }
114         return FALSE;
117 BOOL WINAPI SFileCloseArchive_stub(MPQHANDLE hMPQ)
119         LoadSFMpqDll();
120         if (hSFMpq) {
121                 *(FARPROC *)&SFileCloseArchive = GetProcAddress(hSFMpq,"SFileCloseArchive");
122                 if (SFileCloseArchive) return SFileCloseArchive(hMPQ);
123         }
124         return FALSE;
127 BOOL WINAPI SFileOpenFileAsArchive_stub(MPQHANDLE hSourceMPQ, LPCSTR lpFileName, DWORD dwPriority, DWORD dwFlags, MPQHANDLE *hMPQ)
129         LoadSFMpqDll();
130         if (hSFMpq) {
131                 *(FARPROC *)&SFileOpenFileAsArchive = GetProcAddress(hSFMpq,"SFileOpenFileAsArchive");
132                 if (SFileOpenFileAsArchive) return SFileOpenFileAsArchive(hSourceMPQ,lpFileName,dwPriority,dwFlags,hMPQ);
133         }
134         return FALSE;
137 BOOL WINAPI SFileGetArchiveName_stub(MPQHANDLE hMPQ, LPCSTR lpBuffer, DWORD dwBufferLength)
139         LoadSFMpqDll();
140         if (hSFMpq) {
141                 *(FARPROC *)&SFileGetArchiveName = GetProcAddress(hSFMpq,"SFileGetArchiveName");
142                 if (SFileGetArchiveName) return SFileGetArchiveName(hMPQ,lpBuffer,dwBufferLength);
143         }
144         return FALSE;
147 BOOL WINAPI SFileOpenFile_stub(LPCSTR lpFileName, MPQHANDLE *hFile)
149         LoadSFMpqDll();
150         if (hSFMpq) {
151                 *(FARPROC *)&SFileOpenFile = GetProcAddress(hSFMpq,"SFileOpenFile");
152                 if (SFileOpenFile) return SFileOpenFile(lpFileName,hFile);
153         }
154         return FALSE;
157 BOOL WINAPI SFileOpenFileEx_stub(MPQHANDLE hMPQ, LPCSTR lpFileName, DWORD dwSearchScope, MPQHANDLE *hFile)
159         LoadSFMpqDll();
160         if (hSFMpq) {
161                 *(FARPROC *)&SFileOpenFileEx = GetProcAddress(hSFMpq,"SFileOpenFileEx");
162                 if (SFileOpenFileEx) return SFileOpenFileEx(hMPQ,lpFileName,dwSearchScope,hFile);
163         }
164         return FALSE;
167 BOOL WINAPI SFileCloseFile_stub(MPQHANDLE hFile)
169         LoadSFMpqDll();
170         if (hSFMpq) {
171                 *(FARPROC *)&SFileCloseFile = GetProcAddress(hSFMpq,"SFileCloseFile");
172                 if (SFileCloseFile) return SFileCloseFile(hFile);
173         }
174         return FALSE;
177 DWORD WINAPI SFileGetFileSize_stub(MPQHANDLE hFile, LPDWORD lpFileSizeHigh)
179         LoadSFMpqDll();
180         if (hSFMpq) {
181                 *(FARPROC *)&SFileGetFileSize = GetProcAddress(hSFMpq,"SFileGetFileSize");
182                 if (SFileGetFileSize) return SFileGetFileSize(hFile,lpFileSizeHigh);
183         }
184         return (DWORD)-1;
187 BOOL WINAPI SFileGetFileArchive_stub(MPQHANDLE hFile, MPQHANDLE *hMPQ)
189         LoadSFMpqDll();
190         if (hSFMpq) {
191                 *(FARPROC *)&SFileGetFileArchive = GetProcAddress(hSFMpq,"SFileGetFileArchive");
192                 if (SFileGetFileArchive) return SFileGetFileArchive(hFile,hMPQ);
193         }
194         return FALSE;
197 BOOL WINAPI SFileGetFileName_stub(MPQHANDLE hFile, LPCSTR lpBuffer, DWORD dwBufferLength)
199         LoadSFMpqDll();
200         if (hSFMpq) {
201                 *(FARPROC *)&SFileGetFileName = GetProcAddress(hSFMpq,"SFileGetFileName");
202                 if (SFileGetFileName) return SFileGetFileName(hFile,lpBuffer,dwBufferLength);
203         }
204         return FALSE;
207 DWORD WINAPI SFileSetFilePointer_stub(MPQHANDLE hFile, long lDistanceToMove, PLONG lplDistanceToMoveHigh, DWORD dwMoveMethod)
209         LoadSFMpqDll();
210         if (hSFMpq) {
211                 *(FARPROC *)&SFileSetFilePointer = GetProcAddress(hSFMpq,"SFileSetFilePointer");
212                 if (SFileSetFilePointer) return SFileSetFilePointer(hFile,lDistanceToMove,lplDistanceToMoveHigh,dwMoveMethod);
213         }
214         return (DWORD)-1;
217 BOOL WINAPI SFileReadFile_stub(MPQHANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped)
219         LoadSFMpqDll();
220         if (hSFMpq) {
221                 *(FARPROC *)&SFileReadFile = GetProcAddress(hSFMpq,"SFileReadFile");
222                 if (SFileReadFile) return SFileReadFile(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,lpOverlapped);
223         }
224         return FALSE;
227 LCID WINAPI SFileSetLocale_stub(LCID nNewLocale)
229         LoadSFMpqDll();
230         if (hSFMpq) {
231                 *(FARPROC *)&SFileSetLocale = GetProcAddress(hSFMpq,"SFileSetLocale");
232                 if (SFileSetLocale) return SFileSetLocale(nNewLocale);
233         }
234         return 0;
237 BOOL WINAPI SFileGetBasePath_stub(LPCSTR lpBuffer, DWORD dwBufferLength)
239         LoadSFMpqDll();
240         if (hSFMpq) {
241                 *(FARPROC *)&SFileGetBasePath = GetProcAddress(hSFMpq,"SFileGetBasePath");
242                 if (SFileGetBasePath) return SFileGetBasePath(lpBuffer,dwBufferLength);
243         }
244         return FALSE;
247 BOOL WINAPI SFileSetBasePath_stub(LPCSTR lpNewBasePath)
249         LoadSFMpqDll();
250         if (hSFMpq) {
251                 *(FARPROC *)&SFileSetBasePath = GetProcAddress(hSFMpq,"SFileSetBasePath");
252                 if (SFileSetBasePath) return SFileSetBasePath(lpNewBasePath);
253         }
254         return FALSE;
257 DWORD WINAPI SFileGetFileInfo_stub(MPQHANDLE hFile, DWORD dwInfoType)
259         LoadSFMpqDll();
260         if (hSFMpq) {
261                 *(FARPROC *)&SFileGetFileInfo = GetProcAddress(hSFMpq,"SFileGetFileInfo");
262                 if (SFileGetFileInfo) return SFileGetFileInfo(hFile,dwInfoType);
263         }
264         return (DWORD)-1;
267 BOOL WINAPI SFileSetArchivePriority_stub(MPQHANDLE hMPQ, DWORD dwPriority)
269         LoadSFMpqDll();
270         if (hSFMpq) {
271                 *(FARPROC *)&SFileSetArchivePriority = GetProcAddress(hSFMpq,"SFileSetArchivePriority");
272                 if (SFileSetArchivePriority) return SFileSetArchivePriority(hMPQ,dwPriority);
273         }
274         return FALSE;
277 DWORD WINAPI SFileFindMpqHeader_stub(HANDLE hFile)
279         LoadSFMpqDll();
280         if (hSFMpq) {
281                 *(FARPROC *)&SFileFindMpqHeader = GetProcAddress(hSFMpq,"SFileFindMpqHeader");
282                 if (SFileFindMpqHeader) return SFileFindMpqHeader(hFile);
283         }
284         return (DWORD)-1;
287 BOOL WINAPI SFileListFiles_stub(MPQHANDLE hMPQ, LPCSTR lpFileLists, FILELISTENTRY *lpListBuffer, DWORD dwFlags)
289         LoadSFMpqDll();
290         if (hSFMpq) {
291                 *(FARPROC *)&SFileListFiles = GetProcAddress(hSFMpq,"SFileListFiles");
292                 if (SFileListFiles) return SFileListFiles(hMPQ,lpFileLists,lpListBuffer,dwFlags);
293         }
294         return FALSE;
297 MPQHANDLE WINAPI MpqOpenArchiveForUpdate_stub(LPCSTR lpFileName, DWORD dwFlags, DWORD dwMaximumFilesInArchive)
299         LoadSFMpqDll();
300         if (hSFMpq) {
301                 *(FARPROC *)&MpqOpenArchiveForUpdate = GetProcAddress(hSFMpq,"MpqOpenArchiveForUpdate");
302                 if (MpqOpenArchiveForUpdate) return MpqOpenArchiveForUpdate(lpFileName,dwFlags,dwMaximumFilesInArchive);
303         }
304         return INVALID_HANDLE_VALUE;
307 DWORD WINAPI MpqCloseUpdatedArchive_stub(MPQHANDLE hMPQ, DWORD dwUnknown2)
309         LoadSFMpqDll();
310         if (hSFMpq) {
311                 *(FARPROC *)&MpqCloseUpdatedArchive = GetProcAddress(hSFMpq,"MpqCloseUpdatedArchive");
312                 if (MpqCloseUpdatedArchive) return MpqCloseUpdatedArchive(hMPQ,dwUnknown2);
313         }
314         return 0;
317 BOOL WINAPI MpqAddFileToArchive_stub(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags)
319         LoadSFMpqDll();
320         if (hSFMpq) {
321                 *(FARPROC *)&MpqAddFileToArchive = GetProcAddress(hSFMpq,"MpqAddFileToArchive");
322                 if (MpqAddFileToArchive) return MpqAddFileToArchive(hMPQ,lpSourceFileName,lpDestFileName,dwFlags);
323         }
324         return FALSE;
327 BOOL WINAPI MpqAddWaveToArchive_stub(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags, DWORD dwQuality)
329         LoadSFMpqDll();
330         if (hSFMpq) {
331                 *(FARPROC *)&MpqAddWaveToArchive = GetProcAddress(hSFMpq,"MpqAddWaveToArchive");
332                 if (MpqAddWaveToArchive) return MpqAddWaveToArchive(hMPQ,lpSourceFileName,lpDestFileName,dwFlags,dwQuality);
333         }
334         return FALSE;
337 BOOL WINAPI MpqRenameFile_stub(MPQHANDLE hMPQ, LPCSTR lpcOldFileName, LPCSTR lpcNewFileName)
339         LoadSFMpqDll();
340         if (hSFMpq) {
341                 *(FARPROC *)&MpqRenameFile = GetProcAddress(hSFMpq,"MpqRenameFile");
342                 if (MpqRenameFile) return MpqRenameFile(hMPQ,lpcOldFileName,lpcNewFileName);
343         }
344         return FALSE;
347 BOOL WINAPI MpqDeleteFile_stub(MPQHANDLE hMPQ, LPCSTR lpFileName)
349         LoadSFMpqDll();
350         if (hSFMpq) {
351                 *(FARPROC *)&MpqDeleteFile = GetProcAddress(hSFMpq,"MpqDeleteFile");
352                 if (MpqDeleteFile) return MpqDeleteFile(hMPQ,lpFileName);
353         }
354         return FALSE;
357 BOOL WINAPI MpqCompactArchive_stub(MPQHANDLE hMPQ)
359         LoadSFMpqDll();
360         if (hSFMpq) {
361                 *(FARPROC *)&MpqCompactArchive = GetProcAddress(hSFMpq,"MpqCompactArchive");
362                 if (MpqCompactArchive) return MpqCompactArchive(hMPQ);
363         }
364         return FALSE;
367 MPQHANDLE WINAPI MpqOpenArchiveForUpdateEx_stub(LPCSTR lpFileName, DWORD dwFlags, DWORD dwMaximumFilesInArchive, DWORD dwBlockSize)
369         LoadSFMpqDll();
370         if (hSFMpq) {
371                 *(FARPROC *)&MpqOpenArchiveForUpdateEx = GetProcAddress(hSFMpq,"MpqOpenArchiveForUpdateEx");
372                 if (MpqOpenArchiveForUpdateEx) return MpqOpenArchiveForUpdateEx(lpFileName,dwFlags,dwMaximumFilesInArchive,dwBlockSize);
373         }
374         return INVALID_HANDLE_VALUE;
377 BOOL WINAPI MpqAddFileToArchiveEx_stub(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags, DWORD dwCompressionType, DWORD dwCompressLevel)
379         LoadSFMpqDll();
380         if (hSFMpq) {
381                 *(FARPROC *)&MpqAddFileToArchiveEx = GetProcAddress(hSFMpq,"MpqAddFileToArchiveEx");
382                 if (MpqAddFileToArchiveEx) return MpqAddFileToArchiveEx(hMPQ,lpSourceFileName,lpDestFileName,dwFlags,dwCompressionType,dwCompressLevel);
383         }
384         return FALSE;
387 BOOL WINAPI MpqAddFileFromBufferEx_stub(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags, DWORD dwCompressionType, DWORD dwCompressLevel)
389         LoadSFMpqDll();
390         if (hSFMpq) {
391                 *(FARPROC *)&MpqAddFileFromBufferEx = GetProcAddress(hSFMpq,"MpqAddFileFromBufferEx");
392                 if (MpqAddFileFromBufferEx) return MpqAddFileFromBufferEx(hMPQ,lpBuffer,dwLength,lpFileName,dwFlags,dwCompressionType,dwCompressLevel);
393         }
394         return FALSE;
397 BOOL WINAPI MpqAddFileFromBuffer_stub(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags)
399         LoadSFMpqDll();
400         if (hSFMpq) {
401                 *(FARPROC *)&MpqAddFileFromBuffer = GetProcAddress(hSFMpq,"MpqAddFileFromBuffer");
402                 if (MpqAddFileFromBuffer) return MpqAddFileFromBuffer(hMPQ,lpBuffer,dwLength,lpFileName,dwFlags);
403         }
404         return FALSE;
407 BOOL WINAPI MpqAddWaveFromBuffer_stub(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags, DWORD dwQuality)
409         LoadSFMpqDll();
410         if (hSFMpq) {
411                 *(FARPROC *)&MpqAddWaveFromBuffer = GetProcAddress(hSFMpq,"MpqAddWaveFromBuffer");
412                 if (MpqAddWaveFromBuffer) return MpqAddWaveFromBuffer(hMPQ,lpBuffer,dwLength,lpFileName,dwFlags,dwQuality);
413         }
414         return FALSE;
417 BOOL WINAPI MpqRenameAndSetFileLocale_stub(MPQHANDLE hMPQ, LPCSTR lpcOldFileName, LPCSTR lpcNewFileName, LCID nOldLocale, LCID nNewLocale)
419         LoadSFMpqDll();
420         if (hSFMpq) {
421                 *(FARPROC *)&MpqRenameAndSetFileLocale = GetProcAddress(hSFMpq,"MpqRenameAndSetFileLocale");
422                 if (MpqRenameAndSetFileLocale) return MpqRenameAndSetFileLocale(hMPQ,lpcOldFileName,lpcNewFileName,nOldLocale,nNewLocale);
423         }
424         return FALSE;
427 BOOL WINAPI MpqDeleteFileWithLocale_stub(MPQHANDLE hMPQ, LPCSTR lpFileName, LCID nLocale)
429         LoadSFMpqDll();
430         if (hSFMpq) {
431                 *(FARPROC *)&MpqDeleteFileWithLocale = GetProcAddress(hSFMpq,"MpqDeleteFileWithLocale");
432                 if (MpqDeleteFileWithLocale) return MpqDeleteFileWithLocale(hMPQ,lpFileName,nLocale);
433         }
434         return FALSE;
437 BOOL WINAPI MpqSetFileLocale_stub(MPQHANDLE hMPQ, LPCSTR lpFileName, LCID nOldLocale, LCID nNewLocale)
439         LoadSFMpqDll();
440         if (hSFMpq) {
441                 *(FARPROC *)&MpqSetFileLocale = GetProcAddress(hSFMpq,"MpqSetFileLocale");
442                 if (MpqSetFileLocale) return MpqSetFileLocale(hMPQ,lpFileName,nOldLocale,nNewLocale);
443         }
444         return FALSE;
447 BOOL WINAPI SFileDestroy_stub()
449         LoadSFMpqDll();
450         if (hSFMpq) {
451                 *(FARPROC *)&SFileDestroy = GetProcAddress(hSFMpq,"SFileDestroy");
452                 if (SFileDestroy) return SFileDestroy();
453         }
454         return FALSE;
457 void WINAPI StormDestroy_stub()
459         LoadSFMpqDll();
460         if (hSFMpq) {
461                 *(FARPROC *)&StormDestroy = GetProcAddress(hSFMpq,"StormDestroy");
462                 if (StormDestroy) StormDestroy();
463         }
466 BOOL   (WINAPI* MpqInitialize)() = MpqInitialize_stub;
468 LPCSTR (WINAPI* MpqGetVersionString)() = MpqGetVersionString_stub;
469 float  (WINAPI* MpqGetVersion)() = MpqGetVersion_stub;
471 void (WINAPI* SFMpqDestroy)() = SFMpqDestroy_stub;
473 void (WINAPI* AboutSFMpq)() = AboutSFMpq_stub;
475 LPCSTR (WINAPI* SFMpqGetVersionString)() = SFMpqGetVersionString_stub;
476 DWORD  (WINAPI* SFMpqGetVersionString2)(LPCSTR lpBuffer, DWORD dwBufferLength) = SFMpqGetVersionString2_stub;
477 SFMPQVERSION (WINAPI* SFMpqGetVersion)() = SFMpqGetVersion_stub;
479 BOOL      (WINAPI* SFileOpenArchive)(LPCSTR lpFileName, DWORD dwPriority, DWORD dwFlags, MPQHANDLE *hMPQ) = SFileOpenArchive_stub;
480 BOOL      (WINAPI* SFileCloseArchive)(MPQHANDLE hMPQ) = SFileCloseArchive_stub;
481 BOOL      (WINAPI* SFileOpenFileAsArchive)(MPQHANDLE hSourceMPQ, LPCSTR lpFileName, DWORD dwPriority, DWORD dwFlags, MPQHANDLE *hMPQ) = SFileOpenFileAsArchive_stub;
482 BOOL      (WINAPI* SFileGetArchiveName)(MPQHANDLE hMPQ, LPCSTR lpBuffer, DWORD dwBufferLength) = SFileGetArchiveName_stub;
483 BOOL      (WINAPI* SFileOpenFile)(LPCSTR lpFileName, MPQHANDLE *hFile) = SFileOpenFile_stub;
484 BOOL      (WINAPI* SFileOpenFileEx)(MPQHANDLE hMPQ, LPCSTR lpFileName, DWORD dwSearchScope, MPQHANDLE *hFile) = SFileOpenFileEx_stub;
485 BOOL      (WINAPI* SFileCloseFile)(MPQHANDLE hFile) = SFileCloseFile_stub;
486 DWORD     (WINAPI* SFileGetFileSize)(MPQHANDLE hFile, LPDWORD lpFileSizeHigh) = SFileGetFileSize_stub;
487 BOOL      (WINAPI* SFileGetFileArchive)(MPQHANDLE hFile, MPQHANDLE *hMPQ) = SFileGetFileArchive_stub;
488 BOOL      (WINAPI* SFileGetFileName)(MPQHANDLE hFile, LPCSTR lpBuffer, DWORD dwBufferLength) = SFileGetFileName_stub;
489 DWORD     (WINAPI* SFileSetFilePointer)(MPQHANDLE hFile, long lDistanceToMove, PLONG lplDistanceToMoveHigh, DWORD dwMoveMethod) = SFileSetFilePointer_stub;
490 BOOL      (WINAPI* SFileReadFile)(MPQHANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped) = SFileReadFile_stub;
491 LCID      (WINAPI* SFileSetLocale)(LCID nNewLocale) = SFileSetLocale_stub;
492 BOOL      (WINAPI* SFileGetBasePath)(LPCSTR lpBuffer, DWORD dwBufferLength) = SFileGetBasePath_stub;
493 BOOL      (WINAPI* SFileSetBasePath)(LPCSTR lpNewBasePath) = SFileSetBasePath_stub;
495 DWORD     (WINAPI* SFileGetFileInfo)(MPQHANDLE hFile, DWORD dwInfoType) = SFileGetFileInfo_stub;
496 BOOL      (WINAPI* SFileSetArchivePriority)(MPQHANDLE hMPQ, DWORD dwPriority) = SFileSetArchivePriority_stub;
497 DWORD     (WINAPI* SFileFindMpqHeader)(HANDLE hFile) = SFileFindMpqHeader_stub;
498 BOOL      (WINAPI* SFileListFiles)(MPQHANDLE hMPQ, LPCSTR lpFileLists, FILELISTENTRY *lpListBuffer, DWORD dwFlags) = SFileListFiles_stub;
500 MPQHANDLE (WINAPI* MpqOpenArchiveForUpdate)(LPCSTR lpFileName, DWORD dwFlags, DWORD dwMaximumFilesInArchive) = MpqOpenArchiveForUpdate_stub;
501 DWORD     (WINAPI* MpqCloseUpdatedArchive)(MPQHANDLE hMPQ, DWORD dwUnknown2) = MpqCloseUpdatedArchive_stub;
502 BOOL      (WINAPI* MpqAddFileToArchive)(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags) = MpqAddFileToArchive_stub;
503 BOOL      (WINAPI* MpqAddWaveToArchive)(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags, DWORD dwQuality) = MpqAddWaveToArchive_stub;
504 BOOL      (WINAPI* MpqRenameFile)(MPQHANDLE hMPQ, LPCSTR lpcOldFileName, LPCSTR lpcNewFileName) = MpqRenameFile_stub;
505 BOOL      (WINAPI* MpqDeleteFile)(MPQHANDLE hMPQ, LPCSTR lpFileName) = MpqDeleteFile_stub;
506 BOOL      (WINAPI* MpqCompactArchive)(MPQHANDLE hMPQ) = MpqCompactArchive_stub;
508 MPQHANDLE (WINAPI* MpqOpenArchiveForUpdateEx)(LPCSTR lpFileName, DWORD dwFlags, DWORD dwMaximumFilesInArchive, DWORD dwBlockSize) = MpqOpenArchiveForUpdateEx_stub;
509 BOOL      (WINAPI* MpqAddFileToArchiveEx)(MPQHANDLE hMPQ, LPCSTR lpSourceFileName, LPCSTR lpDestFileName, DWORD dwFlags, DWORD dwCompressionType, DWORD dwCompressLevel) = MpqAddFileToArchiveEx_stub;
510 BOOL      (WINAPI* MpqAddFileFromBufferEx)(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags, DWORD dwCompressionType, DWORD dwCompressLevel) = MpqAddFileFromBufferEx_stub;
511 BOOL      (WINAPI* MpqAddFileFromBuffer)(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags) = MpqAddFileFromBuffer_stub;
512 BOOL      (WINAPI* MpqAddWaveFromBuffer)(MPQHANDLE hMPQ, LPVOID lpBuffer, DWORD dwLength, LPCSTR lpFileName, DWORD dwFlags, DWORD dwQuality) = MpqAddWaveFromBuffer_stub;
513 BOOL      (WINAPI* MpqRenameAndSetFileLocale)(MPQHANDLE hMPQ, LPCSTR lpcOldFileName, LPCSTR lpcNewFileName, LCID nOldLocale, LCID nNewLocale) = MpqRenameAndSetFileLocale_stub;
514 BOOL      (WINAPI* MpqDeleteFileWithLocale)(MPQHANDLE hMPQ, LPCSTR lpFileName, LCID nLocale) = MpqDeleteFileWithLocale_stub;
515 BOOL      (WINAPI* MpqSetFileLocale)(MPQHANDLE hMPQ, LPCSTR lpFileName, LCID nOldLocale, LCID nNewLocale) = MpqSetFileLocale_stub;
517 BOOL      (WINAPI* SFileDestroy)() = SFileDestroy_stub;
518 void      (WINAPI* StormDestroy)() = StormDestroy_stub;
520 #ifndef SFMPQAPI_DELAY_LOAD
521 SFMPQAPI_DELAY_LOADER::SFMPQAPI_DELAY_LOADER()
523         LoadSFMpqDll();
525 #endif
527 SFMPQAPI_DELAY_LOADER::~SFMPQAPI_DELAY_LOADER()
529         MpqInitialize = 0;
531         MpqGetVersionString = 0;
532         MpqGetVersion = 0;
534         AboutSFMpq = 0;
536         SFMpqGetVersionString = 0;
537         SFMpqGetVersionString2 = 0;
538         SFMpqGetVersion = 0;
540         SFileOpenArchive = 0;
541         SFileCloseArchive = 0;
542         SFileOpenFileAsArchive = 0;
543         SFileGetArchiveName = 0;
544         SFileOpenFile = 0;
545         SFileOpenFileEx = 0;
546         SFileCloseFile = 0;
547         SFileGetFileSize = 0;
548         SFileGetFileArchive = 0;
549         SFileGetFileName = 0;
550         SFileSetFilePointer = 0;
551         SFileReadFile = 0;
552         SFileSetLocale = 0;
553         SFileGetBasePath = 0;
554         SFileSetBasePath = 0;
556         SFileGetFileInfo = 0;
557         SFileSetArchivePriority = 0;
558         SFileFindMpqHeader = 0;
559         SFileListFiles = 0;
561         MpqOpenArchiveForUpdate = 0;
562         MpqCloseUpdatedArchive = 0;
563         MpqAddFileToArchive = 0;
564         MpqAddWaveToArchive = 0;
565         MpqRenameFile = 0;
566         MpqDeleteFile = 0;
567         MpqCompactArchive = 0;
569         MpqOpenArchiveForUpdateEx = 0;
570         MpqAddFileToArchiveEx = 0;
571         MpqAddFileFromBufferEx = 0;
572         MpqAddFileFromBuffer = 0;
573         MpqAddWaveFromBuffer = 0;
574         MpqRenameAndSetFileLocale = 0;
575         MpqDeleteFileWithLocale = 0;
576         MpqSetFileLocale = 0;
578         SFileDestroy = 0;
579         StormDestroy = 0;
581         if (hSFMpq==0) return;
582         if (SFMpqDestroy!=0) SFMpqDestroy();
584         SFMpqDestroy = 0;
586         FreeLibrary(hSFMpq);
587         hSFMpq = 0;
590 long SFMpqCompareVersion()
592         SFMPQVERSION ExeVersion = {1,0,8,1};
593         SFMPQVERSION DllVersion = SFMpqGetVersion();
594         if (DllVersion.Major>ExeVersion.Major) return 1;
595         else if (DllVersion.Major<ExeVersion.Major) return -1;
596         if (DllVersion.Minor>ExeVersion.Minor) return 1;
597         else if (DllVersion.Minor<ExeVersion.Minor) return -1;
598         if (DllVersion.Revision>ExeVersion.Revision) return 1;
599         else if (DllVersion.Revision<ExeVersion.Revision) return -1;
600         if (DllVersion.Subrevision>ExeVersion.Subrevision) return 1;
601         else if (DllVersion.Subrevision<ExeVersion.Subrevision) return -1;
602         return 0;