diff --git a/app.h b/app.h index b40394d..0e4ef7c 100644 --- a/app.h +++ b/app.h @@ -1,7 +1,7 @@ /*============================================================================= =============================================================================*/ -#define Q_Version 1,1,0,0 -#define InfoVer "1.1" +#define Q_Version 1,2,0,0 +#define InfoVer "1.2" #define InfoCopy "(c)2024" #ifndef _WIN64 diff --git a/archive.bat b/archive.bat index 3029395..7ffe65c 100644 --- a/archive.bat +++ b/archive.bat @@ -1,7 +1,7 @@ @echo off set RETAIL=1 rem *** set value *** -set arcname=runspx11.zip +set arcname=runspx12.zip set readme=runspx.txt set srcname=runspxsrc.lzh diff --git a/makefile b/makefile index e1a3081..ab11a44 100644 --- a/makefile +++ b/makefile @@ -1,6 +1,6 @@ name = run -UseDebug = 1 # 1 なら debug 指定 +UseDebug = 0 # 1 なら debug 指定 !ifndef UseBCC UseBCC = 1 # 1 なら BCC32 , 0 なら CL !endif diff --git a/release/runspx12.zip b/release/runspx12.zip new file mode 100644 index 0000000..4a42c78 Binary files /dev/null and b/release/runspx12.zip differ diff --git a/run.h b/run.h index 71a782f..b20eef1 100644 --- a/run.h +++ b/run.h @@ -125,15 +125,16 @@ extern const WCHAR *GetTimeStrings(WCHAR *dest, susie_time_t timestamp); typedef struct { BYTE *bits; // ビットマップのイメージ HLOCAL info, bm; - HPALETTE hPalette; +// HPALETTE hPalette; SIZE size; // 画像の大きさ(DIBの値はトップダウンもあるので使わないこと) BITMAPINFOHEADER *DIB; +/* DWORD PaletteOffset; - struct { // 減色パレット BITMAPINFOHEADER dib2; RGBQUAD rgb2[256]; } nb; +*/ } HTBMP; #ifdef __cplusplus diff --git a/run_code.cpp b/run_code.cpp index cce1c2c..c9f12fa 100644 --- a/run_code.cpp +++ b/run_code.cpp @@ -12,6 +12,7 @@ BOOL CheckHeader(void) HANDLE hFile; int result; + if ( IsSupported == NULL ) return FALSE; hFile = OpenFileHeader(header); if ( hFile == INVALID_HANDLE_VALUE ) return FALSE; @@ -38,7 +39,7 @@ void SaveDibData(LPCWSTR lpBmpFn, HLOCAL HBInfo, HLOCAL HBm) lpbmh = LocalLock(HBInfo); lpdib = LocalLock(HBm); if ( lpbmh == NULL || lpdib == NULL || - *(size_t *)lpbmh < sizeof(BITMAPCOREHEADER) || *(size_t *)lpbmh > 256 ) { + *(DWORD *)lpbmh < sizeof(BITMAPCOREHEADER) || *(DWORD *)lpbmh > 256 ) { printout(L"The plug-in has returned an invalid memory block.\n"); LocalUnlock(HBInfo); LocalUnlock(HBm); @@ -53,7 +54,7 @@ void SaveDibData(LPCWSTR lpBmpFn, HLOCAL HBInfo, HLOCAL HBm) return; } - if ( (bmh_bytes = *(size_t *)lpbmh) < sizeof(BITMAPINFOHEADER) ){ /* OS/2 format */ + if ( (bmh_bytes = *(DWORD *)lpbmh) < sizeof(BITMAPINFOHEADER) ){ /* OS/2 format */ LPBITMAPCOREHEADER lpbmch = (LPBITMAPCOREHEADER)lpbmh; if ( lpbmch->bcBitCount <= 8 ){ bmh_bytes += sizeof(RGBTRIPLE) << lpbmch->bcBitCount; diff --git a/run_sub.cpp b/run_sub.cpp index db7ba86..b83a12e 100644 --- a/run_sub.cpp +++ b/run_sub.cpp @@ -217,7 +217,7 @@ void USEFASTCALL printout(const WCHAR *str) void printoutf(const WCHAR *message, ...) { - WCHAR buf[0x800]; + WCHAR buf[0x500]; va_list argptr; va_start(argptr, message); @@ -227,7 +227,7 @@ void printoutf(const WCHAR *message, ...) void printoutfColor(DWORD color, const WCHAR *message, ...) { - WCHAR buf[0x800]; + WCHAR buf[0x500]; va_list argptr; SetColor(color); @@ -282,8 +282,17 @@ const WCHAR *GetTimeStrings(WCHAR *dest, susie_time_t timestamp) return dest; } -#define PrintAPIload(name) printout( (name == NULL) ? L" x" : L" A");printout( (name##W == NULL) ? L" x " UNICODESTR(#name) L"\r\n" : L" W " UNICODESTR(#name) L"\r\n"); -#define PrintAPIload1(name) printout( (name == NULL) ? L" x " UNICODESTR(#name) L"\r\n" : L" O " UNICODESTR(#name) L"\r\n"); +typedef void (__stdcall * SUSIEAPI)(void); +void PrintAPIloadMain(SUSIEAPI funcA, SUSIEAPI funcW, const WCHAR *funcname) +{ + printoutf(L" %c %c %s\t\n", + (funcA == NULL) ? 'x' : 'A', + (funcW == NULL) ? 'x' : 'W', + funcname); +} + +#define PrintAPIload(name) PrintAPIloadMain((SUSIEAPI)name, (SUSIEAPI)name##W, UNICODESTR(#name)) +#define PrintAPIload1(name) printoutf(L" %c " UNICODESTR(#name) L"\r\n", (name == NULL) ? 'x' : 'O'); void ShowAPIlist(void) { @@ -324,87 +333,6 @@ HANDLE OpenFileHeader(char *header) const WCHAR PixSeqence[] = L"\x1b[38;2;%d;%d;%dm\x1b[48;2;%d;%d;%dm\u2584"; -/* DIBのヘッダからパレットを作成する */ -HPALETTE DIBtoPalette(HTBMP *hTbmp, int maxY) -{ - struct { - WORD palVersion; - WORD palNumEntries; - PALETTEENTRY palPalEntry[256]; - } lPal; - PALETTEENTRY *ppal; - RGBQUAD *rgb; - int r, g, b; - DWORD ClrUsed; - BYTE *src, *dst; - BITMAPINFOHEADER *dib; - - dib = hTbmp->DIB; - ClrUsed = dib->biClrUsed ? dib->biClrUsed : (DWORD)(1 << dib->biBitCount); - lPal.palNumEntries = (WORD)ClrUsed; - lPal.palVersion = 0x300; - ppal = lPal.palPalEntry; - if ( ClrUsed > 256 ){ //フルカラー画像は全体に散らばったパレットを作成 - HDC hDC; - int VideoBits; - - hDC = GetDC(NULL); - VideoBits = GetDeviceCaps(hDC, BITSPIXEL); - ReleaseDC(NULL, hDC); - if ( VideoBits > 8 ) return NULL; // 画面が256超なのでそのまま表示可能 - - rgb = hTbmp->nb.rgb2; - lPal.palNumEntries = 6 * 6 * 6; - for( b = 0 ; b <= 255 ; b += 51 ){ - for(g = 0 ; g <= 255 ; g += 51){ - for(r = 0 ; r <= 255 ; r += 51, ppal++){ - rgb->rgbRed = ppal->peRed = (BYTE)r; - rgb->rgbGreen = ppal->peGreen = (BYTE)g; - rgb->rgbBlue = ppal->peBlue = (BYTE)b; - rgb->rgbReserved = ppal->peFlags = 0; - rgb++; - } - } - } - - if ( dib->biBitCount == 24 ){ - int x, y; - - src = dst = hTbmp->bits; - dib->biSizeImage = hTbmp->size.cx * maxY; - for ( y = 0; y < maxY ; y++ ){ - for ( x = 0; x < dib->biWidth ; x++ ){ - r = ((*(src++) + 25) / 51); // red - g = ((*(src++) + 25) / 51); // green - // blue - *dst++ = (BYTE)(r * 36 + g * 6 + ((*(src++) +25) / 51)); - } - src += (4 - ALIGNMENT_BITS(src)) & 3; - dst += (4 - ALIGNMENT_BITS(dst)) & 3; - } - dib->biBitCount = 8; - dib->biCompression = BI_RGB; - dib->biClrUsed = 6*6*6; - dib->biClrImportant = 0; - hTbmp->nb.dib2 = *dib; - hTbmp->DIB = &hTbmp->nb.dib2; - } - }else{ - DWORD ci; - - rgb = (LPRGBQUAD)((BYTE *)hTbmp->DIB + hTbmp->PaletteOffset); - if ( IsBadReadPtr(rgb, ClrUsed * sizeof(RGBQUAD)) ) return NULL; - - for ( ci = 0; ci < ClrUsed; ci++, rgb++, ppal++ ){ - ppal->peRed = rgb->rgbRed; - ppal->peGreen = rgb->rgbGreen; - ppal->peBlue = rgb->rgbBlue; - ppal->peFlags = 0; - } - } - return CreatePalette((LOGPALETTE *)&lPal); -} - BOOL InitBMP(HTBMP *hTbmp) { int palette; @@ -414,7 +342,7 @@ BOOL InitBMP(HTBMP *hTbmp) if ( (hTbmp->DIB = (BITMAPINFOHEADER *)LocalLock(hTbmp->info)) == NULL ) goto error; if ( (hTbmp->bits = (BYTE *)LocalLock(hTbmp->bm)) == NULL ) goto error; - hTbmp->hPalette = NULL; +// hTbmp->hPalette = NULL; offset = hTbmp->DIB->biSize; color = hTbmp->DIB->biBitCount; @@ -422,7 +350,7 @@ BOOL InitBMP(HTBMP *hTbmp) if ( (offset < (sizeof(BITMAPINFOHEADER) + 12) ) && (hTbmp->DIB->biCompression == BI_BITFIELDS) ){ offset += 12; // 16/32bit のときはビット割り当てがある } - hTbmp->PaletteOffset = offset; +// hTbmp->PaletteOffset = offset; #pragma warning(suppress: 6297) // color は 8以下で、DWORD を越えることがない offset += palette ? palette * (DWORD)sizeof(RGBQUAD) : ((color <= 8) ? (DWORD)(1 << color) * (DWORD)sizeof(RGBQUAD) : 0); @@ -438,11 +366,12 @@ BOOL InitBMP(HTBMP *hTbmp) if ( hTbmp->size.cy < 0 ) hTbmp->size.cy = -hTbmp->size.cy; // トップダウン if ( palette && (color <= 8) ) hTbmp->DIB->biClrUsed = 1 << color; - hTbmp->hPalette = DIBtoPalette(hTbmp, hTbmp->size.cy); + // ShowImageToConsole では hPalette を使わないので省略 +// hTbmp->hPalette = DIBtoPalette(hTbmp, hTbmp->size.cy); return TRUE; error: hTbmp->DIB = NULL; - hTbmp->hPalette = NULL; +// hTbmp->hPalette = NULL; return FALSE; } @@ -513,11 +442,9 @@ BOOL ShowImageToConsole(HLOCAL HBInfo, HLOCAL HBm) hDestBMP = CreateDIBSection(NULL, &bmpinfo, DIB_RGB_COLORS, &lpBits, NULL, 0); - // 元画像を複写 hOldDstBMP = SelectObject(hDstDC, hDestBMP); SetStretchBltMode(hDstDC, HALFTONE); - // 追加画像を複写 StretchDIBits(hDstDC, 0, 0, bmpinfo.bmiHeader.biWidth, bmpinfo.bmiHeader.biHeight, 0, 0, hTbmp.size.cx, hTbmp.size.cy, diff --git a/run_test.cpp b/run_test.cpp index 4f24f51..f5d0c1b 100644 --- a/run_test.cpp +++ b/run_test.cpp @@ -75,7 +75,6 @@ void PluginResult(int result) void LoadSourceImage(void) { HANDLE hFile; - DWORD sizeL, sizeH, size; if ( testmem == testmem_zerosize ){ SourceSize = 0; @@ -97,16 +96,20 @@ void LoadSourceImage(void) FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); if ( hFile != INVALID_HANDLE_VALUE ){ - SourceSize = sizeL = GetFileSize(hFile, &sizeH); - SourceAllocSize = sizeL + 256; + LARGE_INTEGER filesize; + DWORD size; + + GetFileSizeEx(hFile, &filesize); + SourceSize = filesize.u.LowPart; + SourceAllocSize = filesize.u.LowPart + 256; if ( testmem < 0 ){ - testmem = (sizeH == 0) && (sizeL <= MAX_TEST_ON_MEMORY); + testmem = filesize.QuadPart <= MAX_TEST_ON_MEMORY; } if ( testmem ){ SourceImage = (char *)malloc(SourceAllocSize); CompareSourceImage = (char *)malloc(SourceAllocSize); memset(SourceImage, WRITECHECK_BYTE, SourceAllocSize); - ReadFile(hFile, SourceImage, sizeL, &size, NULL); + ReadFile(hFile, SourceImage, filesize.u.LowPart, &size, NULL); memcpy(CompareSourceImage, SourceImage, SourceAllocSize); }else{ printout(L"*ソースファイルが大きいためチェックできない\r\n"); @@ -587,7 +590,15 @@ void TestGetPluginInfo(void) #define INFOBUFCHECKLEN 500 char bufA[INFOBUFLEN]; WCHAR bufW[INFOBUFLEN], cbuf[32], *memo; - int result, result_checklen; + int result, result_checklen, result_susielen; + + if ( infono >= 2 ){ + result_susielen = 255; + }else if ( infono == 1 ){ + result_susielen = 128; + }else{ + result_susielen = 8; + } if ( unicode == FALSE ){ if ( infono >= 1 ){ @@ -605,21 +616,12 @@ void TestGetPluginInfo(void) memset(bufA, WRITECHECK_BYTE, sizeof(bufA)); result = GetPluginInfo(infono, bufA, INFOBUFCHECKLEN); - if ( result == 0 ){ TestGetPluginInfo_noinfo(infono); break; } - if ( result > INFOBUFCHECKLEN ){ - ShowComment(L" ● infono=%d: 戻り値(%d)が指定最大値(%d)超\r\n", infono, result, INFOBUFCHECKLEN); - result = INFOBUFCHECKLEN - 1; - } bufA[INFOBUFLEN - 1] = '\0'; result_checklen = strlen(bufA); - if ( result_checklen > result ){ - ShowComment(L" ● infono=%d: buf の末尾が \\0 でない\r\n", infono); - bufA[result] = '\0'; - } AnsiToUnicode(bufA, bufW, INFOBUFCHECKLEN); }else{ if ( infono >= 1 ){ @@ -642,15 +644,19 @@ void TestGetPluginInfo(void) TestGetPluginInfo_noinfo(infono); break; } - if ( result > INFOBUFCHECKLEN ){ - ShowComment(L" ● infono=%d: 戻り値(%d)が指定最大値(%d)超\r\n", infono, result, INFOBUFCHECKLEN); - result = INFOBUFCHECKLEN - 1; - } bufW[INFOBUFLEN - 1] = '\0'; result_checklen = strlenW(bufW); - if ( result_checklen > result ){ - ShowComment(L" ● infono=%d: buf の末尾が \\0 でない\r\n", infono); - } + } + + if ( result > INFOBUFCHECKLEN ){ + ShowComment(L" ● infono=%d: 戻り値(%d)が指定最大値(%d)超\r\n", infono, result, INFOBUFCHECKLEN); + result = INFOBUFCHECKLEN - 1; + } + if ( result_checklen > result ){ + ShowComment(L" ● infono=%d: buf の末尾が \\0 でない\r\n", infono); + } + if ( result_checklen >= result_susielen ){ + ShowComment(L" ● infono=%d: Susie(%d)では扱えない長さ\r\n", infono, result_susielen); } memo = L""; @@ -714,7 +720,10 @@ void TestIsSupported(void) for (;; unicode = TRUE){ if ( unicode == FALSE ){ // ansi - if ( IsSupported == NULL ) continue; + if ( IsSupported == NULL ){ + ShowComment(L" ● IsSupported が存在しない\r\n"); + continue; + } PrintAPIname("IsSupported(LPCSTR filename, void *dw)"); strcpy(bufA, "non-existence"); @@ -1320,7 +1329,7 @@ void TestGetFile(void) } } if ( testmem ){ - result = GetFile(SourceImage, SourceSize, (LPSTR)&hImage, SUSIE_SOURCE_MEM | SUSIE_DEST_MEM, (FARPROC)SusieProgressCallbackCheck, (LONG_PTR)&sourcenameA); + result = GetFile(SourceImage + finfoAptr->position, SourceSize, (LPSTR)&hImage, SUSIE_SOURCE_MEM | SUSIE_DEST_MEM, (FARPROC)SusieProgressCallbackCheck, (LONG_PTR)&sourcenameA); if ( result == SUSIEERROR_NOERROR ){ printout(L"Mm"); check++; @@ -1347,7 +1356,7 @@ void TestGetFile(void) result = GetFile(sourcenameA, finfoAptr->position, dest, SUSIE_SOURCE_DISK | SUSIE_DEST_DISK, (FARPROC)SusieProgressCallbackCheck, (LONG_PTR)&sourcenameA); if ( result == SUSIEERROR_NOERROR ){ HANDLE hFile; - DWORD sizeL, sizeH; + LARGE_INTEGER filesize; printout(L"Dd"); check++; @@ -1357,10 +1366,10 @@ void TestGetFile(void) if ( hFile == INVALID_HANDLE_VALUE ){ ShowComment(L" ● #%d(%hs, file->file) 取得不可\r\n", count, destfile); }else{ - sizeL = GetFileSize(hFile, &sizeH); + GetFileSizeEx(hFile, &filesize); CloseHandle(hFile); - if ( sizeL != finfoAptr->filesize ){ - ShowComment(L" ● #%d(%hs, file->file) ファイルサイズが filesize と不一致(%d != %d)\r\n", count, textA, sizeL, finfoAptr->filesize); + if ( filesize.QuadPart != finfoAptr->filesize ){ + ShowComment(L" ● #%d(%hs, file->file) ファイルサイズが filesize と不一致(%d != %d)\r\n", count, textA, filesize.u.LowPart, finfoAptr->filesize); }else{ check_file_file++; } @@ -1372,7 +1381,7 @@ void TestGetFile(void) result = GetFile(SourceImage, SourceSize, dest, SUSIE_SOURCE_MEM | SUSIE_DEST_DISK, (FARPROC)SusieProgressCallbackCheck, (LONG_PTR)&sourcenameA); if ( result == SUSIEERROR_NOERROR ){ HANDLE hFile; - DWORD sizeL, sizeH; + LARGE_INTEGER filesize; printout(L"Md"); check++; @@ -1382,10 +1391,10 @@ void TestGetFile(void) if ( hFile == INVALID_HANDLE_VALUE ){ ShowComment(L" ● #%d(%hs, mem->file) 取得不可\r\n", count, destfile); }else{ - sizeL = GetFileSize(hFile, &sizeH); + GetFileSizeEx(hFile, &filesize); CloseHandle(hFile); - if ( sizeL != finfoAptr->filesize ){ - ShowComment(L" ● #%d(%hs, mem->file) ファイルサイズが filesize と不一致(%d != %d )\r\n", count, textA, sizeL, finfoAptr->filesize); + if ( filesize.QuadPart != finfoAptr->filesize ){ + ShowComment(L" ● #%d(%hs, mem->file) ファイルサイズが filesize と不一致(%d != %d )\r\n", count, textA, filesize.u.LowPart, finfoAptr->filesize); }else{ check_file_file++; } @@ -1452,7 +1461,7 @@ void TestGetFile(void) } } if ( testmem ){ - result = GetFileW((WCHAR *)SourceImage, SourceSize, (LPWSTR)&hImage, SUSIE_SOURCE_MEM | SUSIE_DEST_MEM, (FARPROC)SusieProgressCallbackCheck, (LONG_PTR)&sourcenameA); + result = GetFileW((WCHAR *)(char *)(SourceImage + finfoWptr->position), SourceSize, (LPWSTR)&hImage, SUSIE_SOURCE_MEM | SUSIE_DEST_MEM, (FARPROC)SusieProgressCallbackCheck, (LONG_PTR)&sourcenameA); if ( result == SUSIEERROR_NOERROR ){ printout(L"Mm"); check++; @@ -1479,7 +1488,7 @@ void TestGetFile(void) result = GetFileW(sourcename, finfoWptr->position, dest, SUSIE_SOURCE_DISK | SUSIE_DEST_DISK, (FARPROC)SusieProgressCallbackCheck, (LONG_PTR)&sourcenameA); if ( result == SUSIEERROR_NOERROR ){ HANDLE hFile; - DWORD sizeL, sizeH; + LARGE_INTEGER filesize; printout(L"Dd"); check++; @@ -1489,10 +1498,10 @@ void TestGetFile(void) if ( hFile == INVALID_HANDLE_VALUE ){ ShowComment(L" ● #%d(%s, file->file) 取得不可\r\n", count, destfile); }else{ - sizeL = GetFileSize(hFile, &sizeH); + GetFileSizeEx(hFile, &filesize); CloseHandle(hFile); - if ( sizeL != finfoWptr->filesize ){ - ShowComment(L" ● #%d(%s, file->file) ファイルサイズが filesize と不一致(%d != %d)\r\n", count, textW, sizeL, finfoWptr->filesize); + if ( filesize.QuadPart != finfoWptr->filesize ){ + ShowComment(L" ● #%d(%s, file->file) ファイルサイズが filesize と不一致(%d != %d)\r\n", count, textW, filesize.u.LowPart, finfoWptr->filesize); }else{ check_file_file++; } @@ -1503,7 +1512,7 @@ void TestGetFile(void) result = GetFileW((WCHAR *)SourceImage, SourceSize, dest, SUSIE_SOURCE_MEM | SUSIE_DEST_DISK, (FARPROC)SusieProgressCallbackCheck, (LONG_PTR)&sourcenameA); if ( result == SUSIEERROR_NOERROR ){ HANDLE hFile; - DWORD sizeL, sizeH; + LARGE_INTEGER filesize; printout(L"Md"); check++; @@ -1512,11 +1521,11 @@ void TestGetFile(void) OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); if ( hFile == INVALID_HANDLE_VALUE ){ ShowComment(L" ● #%d(%s, mem->file) 取得不可\r\n", count, destfile); - }else{ - sizeL = GetFileSize(hFile, &sizeH); + }else{ + GetFileSizeEx(hFile, &filesize); CloseHandle(hFile); - if ( sizeL != finfoWptr->filesize ){ - ShowComment(L" ● #%d(%s, mem->file) ファイルサイズが filesize と不一致(%d != %d)\r\n", count, textW, sizeL, finfoWptr->filesize); + if ( filesize.QuadPart != finfoWptr->filesize ){ + ShowComment(L" ● #%d(%s, mem->file) ファイルサイズが filesize と不一致(%d != %d)\r\n", count, textW, filesize.u.LowPart, finfoWptr->filesize); }else{ check_file_file++; } diff --git a/runspx.txt b/runspx.txt index 3e430aa..f328bac 100644 --- a/runspx.txt +++ b/runspx.txt @@ -1,5 +1,5 @@ ------------------------------------------------------------------------------ - runspi / runsph / runspha Version 1.1 Copyright (c)2024 TORO + runspi / runsph / runspha Version 1.2 Copyright (c)2024 TORO ------------------------------------------------------------------------------ Susie Plug-in を使って画像の取得、書庫展開をしたり、Susie Plug-inの @@ -130,6 +130,7 @@ また、拡張子は .sph としています。詳細は次の場所で公開しています。 http://toro.d.dooo.jp/dlsphapi.html + https://toroidj.github.io/dlsphapi.html //-------------------------------------- DLL 定数 @@ -262,6 +263,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ●履歴 +Version 1.2 2024/03/30 +・GetFileのテストで、ソースがメモリの時の動作がおかしいのを修正 + Version 1.1 2024/03/17 ・書庫の指定ファイル展開の説明の誤記修正と、展開が終わらないことがあるのを修正