• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision8817 (tree)
Time2020-06-26 00:28:14
Authorzmatsuo

Log Message

crosses initialization エラーを修正

- gcc,clang ででるエラーを修正
- パスも含めたファイル名の MAX_PATH 制限をなくした

Change Summary

Incremental Difference

--- trunk/teraterm/susie_plugin/libsusieplugin.cpp (revision 8816)
+++ trunk/teraterm/susie_plugin/libsusieplugin.cpp (revision 8817)
@@ -58,11 +58,26 @@
5858 * 画像ファイル名はプラグイン内で多分使用されない
5959 * プラグイン内でファイルは扱わないので Unicode化はokと思われる
6060 */
61-BOOL LoadPictureWithSPI(const wchar_t *nameSPI, const wchar_t *nameFile, unsigned char *bufFile, long sizeFile, HLOCAL *hbuf,
61+BOOL LoadPictureWithSPI(const wchar_t *nameSPI, const wchar_t *nameFile, unsigned char *bufFile, size_t sizeFile, HLOCAL *hbuf,
6262 HLOCAL *hbmi)
6363 {
64+ // 画像ファイルのファイル名部分を取り出す
65+ const wchar_t *image_base = wcsrchr(nameFile, L'\\');
66+ if (image_base != NULL) {
67+ image_base++;
68+ }
69+ else {
70+ image_base = wcsrchr(nameFile, L'/');
71+ if (image_base != NULL) {
72+ image_base++;
73+ }
74+ else {
75+ image_base = nameFile;
76+ }
77+ }
78+
6479 char nameFileA[MAX_PATH];
65- WideCharToMultiByte(CP_ACP, 0, nameFile, -1, nameFileA, _countof(nameFileA), NULL, NULL);
80+ WideCharToMultiByte(CP_ACP, 0, image_base, -1, nameFileA, _countof(nameFileA), NULL, NULL);
6681
6782 HINSTANCE hSPI;
6883 char spiVersion[8];
@@ -77,10 +92,10 @@
7792
7893 // SPI をロード
7994 hSPI = LoadLibraryW(nameSPI);
95+ if (!hSPI) {
96+ return FALSE;
97+ }
8098
81- if (!hSPI)
82- goto error;
83-
8499 FARPROC *p = (FARPROC *)&SPI_GetPluginInfo;
85100 *p = GetProcAddress(hSPI, "GetPluginInfo");
86101 p = (FARPROC *)&SPI_IsSupported;
@@ -113,28 +128,11 @@
113128 return ret;
114129 }
115130
116-/**
117- * Susieプラグインを使って画像ファイルをロードする
118- * 指定フォルダ内のプラグインを使ってロードを試みる
119- *
120- * @param[in] image_file 画像ファイル
121- * @param[in] spi_path "c:\\path\\to\\spi"
122- * このフォルダにあるプラグインファイルで画像のロードを試みる
123- * パスの最後に "\\" があってもなくても良い
124- * @param[out] pHBInfo BITMAPINFO LocalFree()すること
125- * @param[out] pHBm bitmap data LocalFree()すること
126- * @retval TRUE ロードok
127- * @retval FALSE ロードできなかった
128- */
129-BOOL SusieLoadPicture(const wchar_t *image_file, const wchar_t *spi_path, HANDLE *pHBInfo, HANDLE *pHBm)
131+static unsigned char *LoadImageFile(const wchar_t *image_file, size_t *file_size)
130132 {
131- BOOL result = FALSE;
132- *pHBInfo = NULL;
133- *pHBm = NULL;
134-
135- //ファイルを読み込む
136133 HANDLE hPictureFile = CreateFileW(image_file, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
137134 if (hPictureFile == INVALID_HANDLE_VALUE) {
135+ *file_size = 0;
138136 return FALSE;
139137 }
140138 DWORD fileSize = GetFileSize(hPictureFile, 0);
@@ -148,61 +146,112 @@
148146 ReadFile(hPictureFile, fileBuf, fileSize, &readByte, 0);
149147 CloseHandle(hPictureFile);
150148
151- // spi_path を絶対パスに変換
152- wchar_t spi_path_full[MAX_PATH];
153- if (!GetFullPathNameW(spi_path, _countof(spi_path_full), spi_path_full, NULL)) {
154- goto finish;
149+ *file_size = fileSize;
150+ return fileBuf;
151+}
152+
153+static wchar_t *NormalizePath(const wchar_t *path)
154+{
155+ size_t len = GetFullPathNameW(path, 0, NULL, NULL); // include L'\0'
156+ if (len == 0) {
157+ return NULL;
155158 }
156- wchar_t *p = wcsrchr(spi_path_full, L'\\');
159+ wchar_t *normalized_path = (wchar_t *)malloc(sizeof(wchar_t) * len);
160+ len = GetFullPathNameW(path, (DWORD)len, normalized_path, NULL);
161+ if (len == 0) {
162+ free(normalized_path);
163+ return NULL;
164+ }
165+ wchar_t *p = wcsrchr(normalized_path, L'\\');
157166 if (p != NULL) {
158167 if (*(p + 1) == 0) {
159168 *p = 0; // delete last '\\'
160169 }
161170 }
162- DWORD attr = GetFileAttributesW(spi_path_full);
171+ DWORD attr = GetFileAttributesW(normalized_path);
163172 if (attr == INVALID_FILE_ATTRIBUTES || (attr & FILE_ATTRIBUTE_DIRECTORY) == 0) {
164- goto finish;
173+ free(normalized_path);
174+ return NULL;
165175 }
176+ return normalized_path;
177+}
166178
167- wchar_t spi_path_mask[MAX_PATH];
168- wcsncpy_s(spi_path_mask, _countof(spi_path_mask), spi_path_full, _TRUNCATE);
169- wcsncat_s(spi_path_mask, _countof(spi_path_mask), L"\\*.*", _TRUNCATE);
179+/**
180+ * Susieプラグインを使って画像ファイルをロードする
181+ * 指定フォルダ内のプラグインを使ってロードを試みる
182+ *
183+ * @param[in] image_file 画像ファイル
184+ * @param[in] spi_path "c:\\path\\to\\spi"
185+ * このフォルダにあるプラグインファイルで画像のロードを試みる
186+ * パスの最後に "\\" があってもなくても良い
187+ * @param[out] pHBInfo BITMAPINFO LocalFree()すること
188+ * @param[out] pHBm bitmap data LocalFree()すること
189+ * @retval TRUE ロードok
190+ * @retval FALSE ロードできなかった
191+ */
192+BOOL SusieLoadPicture(const wchar_t *image_file, const wchar_t *spi_path, HANDLE *pHBInfo, HANDLE *pHBm)
193+{
194+ BOOL result = FALSE;
195+ *pHBInfo = NULL;
196+ *pHBm = NULL;
170197
198+ size_t file_size;
199+ unsigned char *file_ptr = LoadImageFile(image_file, &file_size);
200+ if (file_ptr == NULL) {
201+ return FALSE;
202+ }
203+
204+ // spi_path を絶対パスに変換
205+ wchar_t *spi_path_full = NormalizePath(spi_path);
206+ if (spi_path_full == NULL) {
207+ free(file_ptr);
208+ return FALSE;
209+ }
210+ const size_t spi_path_full_len = wcslen(spi_path_full);
211+
212+ // mask作成
213+ const size_t spi_path_mask_len = spi_path_full_len + 4 + 1;
214+ wchar_t *spi_path_mask = (wchar_t *)malloc(spi_path_mask_len * sizeof(wchar_t));
215+ wcsncpy_s(spi_path_mask, spi_path_mask_len, spi_path_full, _TRUNCATE);
216+ wcsncat_s(spi_path_mask, spi_path_mask_len, L"\\*.*", _TRUNCATE);
217+
171218 //プラグインを当たっていく
172219 WIN32_FIND_DATAW fd;
173220 HANDLE hFind = FindFirstFileW(spi_path_mask, &fd);
174- if (hFind == INVALID_HANDLE_VALUE) {
175- goto finish;
176- }
177- do {
178- if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
179- continue;
180- const wchar_t *ext = wcsrchr(fd.cFileName, L'.');
181- if (ext == NULL) {
182- // 拡張子がないファイル?
183- continue;
184- }
185- if (wcscmp(ext, L".dll") != 0 && wcscmp(ext, PLUGIN_EXT) != 0) {
186- // .dll or .spi(or sph) 以外のファイル
187- continue;
188- }
221+ if (hFind != INVALID_HANDLE_VALUE) {
222+ const size_t spiFileNameLen = spi_path_full_len + 1 + _countof(fd.cFileName);
223+ wchar_t *spiFileName = (wchar_t *)malloc(spiFileNameLen * sizeof(wchar_t));
224+ do {
225+ if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
226+ continue;
227+ const wchar_t *ext = wcsrchr(fd.cFileName, L'.');
228+ if (ext == NULL) {
229+ // 拡張子がないファイル?
230+ continue;
231+ }
232+ if (wcscmp(ext, L".dll") != 0 && wcscmp(ext, PLUGIN_EXT) != 0) {
233+ // .dll or .spi(or sph) 以外のファイル
234+ continue;
235+ }
189236
190- wchar_t spiFileName[MAX_PATH];
191- wcsncpy_s(spiFileName, _countof(spiFileName), spi_path_full, _TRUNCATE);
192- wcsncat_s(spiFileName, _countof(spiFileName), L"\\", _TRUNCATE);
193- wcsncat_s(spiFileName, _countof(spiFileName), fd.cFileName, _TRUNCATE);
237+ wcsncpy_s(spiFileName, spiFileNameLen, spi_path_full, _TRUNCATE);
238+ wcsncat_s(spiFileName, spiFileNameLen, L"\\", _TRUNCATE);
239+ wcsncat_s(spiFileName, spiFileNameLen, fd.cFileName, _TRUNCATE);
194240
195- HLOCAL hbuf, hbmi;
196- if (LoadPictureWithSPI(spiFileName, image_file, fileBuf, fileSize, &hbuf, &hbmi)) {
197- *pHBInfo = hbmi;
198- *pHBm = hbuf;
199- result = TRUE;
200- break;
201- }
202- } while (FindNextFileW(hFind, &fd));
203- FindClose(hFind);
241+ HLOCAL hbuf, hbmi;
242+ if (LoadPictureWithSPI(spiFileName, image_file, file_ptr, file_size, &hbuf, &hbmi)) {
243+ *pHBInfo = hbmi;
244+ *pHBm = hbuf;
245+ result = TRUE;
246+ break;
247+ }
248+ } while (FindNextFileW(hFind, &fd));
249+ free(spiFileName);
250+ FindClose(hFind);
251+ }
204252
205-finish:
206- free(fileBuf);
253+ free(spi_path_full);
254+ free(spi_path_mask);
255+ free(file_ptr);
207256 return result;
208257 }
Show on old repository browser