* copy vendor drop to trunk
[lab.git] / Dev / utvpn / utvpn-unix-v101-7101-public / src / Cedar / Win32Html.cpp
1 // SoftEther UT-VPN SourceCode\r
2 // \r
3 // Copyright (C) 2004-2010 SoftEther Corporation.\r
4 // Copyright (C) 2004-2010 University of Tsukuba, Japan.\r
5 // Copyright (C) 2003-2010 Daiyuu Nobori.\r
6 // All Rights Reserved.\r
7 // \r
8 // http://utvpn.tsukuba.ac.jp/\r
9 // \r
10 // This program is free software; you can redistribute it and/or\r
11 // modify it under the terms of the GNU General Public License\r
12 // version 2 as published by the Free Software Foundation.\r
13 // \r
14 // This program is distributed in the hope that it will be useful,\r
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
17 // GNU General Public License for more details.\r
18 // \r
19 // You should have received a copy of the GNU General Public License version 2\r
20 // along with this program; if not, write to the Free Software\r
21 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
22 // \r
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。\r
28 // \r
29 // この SoftEther UT-VPN オープンソース・プロジェクトは、日本国の\r
30 // ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )\r
31 // および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって\r
32 // ホストされています。\r
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、\r
34 // および、試験または研究のために利用が行われることを想定して配布\r
35 // しています。\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に\r
37 // あります。\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース\r
42 // に組み込みさせていただきます。\r
43 // \r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。\r
46 // \r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意\r
51 // ください。\r
52 // \r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、\r
58 // 公益保護にご協力いただきますようお願い申し上げます。\r
59 // \r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客\r
62 // を保護するための努力を行います。\r
63 // \r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/\r
65 // 日本国内の脆弱性情報届出受付公的機関:\r
66 //         独立行政法人 情報処理推進機構\r
67 //         http://www.ipa.go.jp/security/vuln/report/\r
68 // \r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/\r
71 \r
72 // -----------------------------------------------\r
73 // [ChangeLog]\r
74 // 2010.05.20\r
75 //  新規リリース by SoftEther\r
76 // -----------------------------------------------\r
77 \r
78 // Win32Html.c\r
79 // Win32 用 HTML 表示モジュール\r
80 \r
81 // Q. ソースコード名が「HTML」となっているが、どう見ても HTML に関係のない処理\r
82 //    が入っているように見える。\r
83 // A. はい。\r
84 \r
85 #ifdef  WIN32\r
86 \r
87 #define WIN32HTML_CPP\r
88 \r
89 //#define       _WIN32_WINNT            0x0502\r
90 //#define       WINVER                          0x0502\r
91 #include <winsock2.h>\r
92 #include <windows.h>\r
93 #include <wincrypt.h>\r
94 #include <wininet.h>\r
95 #include <comdef.h>\r
96 #include <Mshtmhst.h>\r
97 #include <shlobj.h>\r
98 #include <commctrl.h>\r
99 #include <Dbghelp.h>\r
100 #include <stdio.h>\r
101 #include <stdlib.h>\r
102 #include <string.h>\r
103 #include <wchar.h>\r
104 #include <stdarg.h>\r
105 #include <time.h>\r
106 #include <errno.h>\r
107 extern "C"\r
108 {\r
109 #include <Mayaqua/Mayaqua.h>\r
110 #include <Cedar/Cedar.h>\r
111 }\r
112 #include "../PenCore/resource.h"\r
113 \r
114 typedef struct FOLDER_DLG_INNER_DATA\r
115 {\r
116         wchar_t *default_dir;\r
117 } FOLDER_DLG_INNER_DATA;\r
118 \r
119 int CALLBACK FolderDlgInnerCallbackA(HWND hWnd, UINT msg, LPARAM lParam, LPARAM lData)\r
120 {\r
121         FOLDER_DLG_INNER_DATA *data = (FOLDER_DLG_INNER_DATA *)lData;\r
122         LPITEMIDLIST pidl;\r
123 \r
124         switch (msg)\r
125         {\r
126         case BFFM_INITIALIZED:\r
127                 if (data->default_dir != NULL)\r
128                 {\r
129                         char *default_dir_a = CopyUniToStr(data->default_dir);\r
130 \r
131                         SendMessage(hWnd, BFFM_SETSELECTIONA, true, (LPARAM)default_dir_a);\r
132 \r
133                         Free(default_dir_a);\r
134                 }\r
135                 break;\r
136 \r
137         case BFFM_SELCHANGED:\r
138                 pidl = (LPITEMIDLIST)lParam;\r
139 \r
140                 if (pidl)\r
141                 {\r
142                         char tmp[MAX_PATH];\r
143 \r
144                         Zero(tmp, sizeof(tmp));\r
145                         if (SHGetPathFromIDListA(pidl, tmp))\r
146                         {\r
147                                 SendMessage(hWnd, BFFM_ENABLEOK, 0, 1);\r
148                         }\r
149                         else\r
150                         {\r
151                                 SendMessage(hWnd, BFFM_ENABLEOK, 0, 0);\r
152                         }\r
153                 }\r
154                 break;\r
155         }\r
156 \r
157         return 0;\r
158 }\r
159 \r
160 char *FolderDlgInnerA(HWND hWnd, wchar_t *title, char *default_dir)\r
161 {\r
162         BROWSEINFOA info;\r
163         char display_name[MAX_PATH];\r
164         FOLDER_DLG_INNER_DATA data;\r
165         LPMALLOC pMalloc;\r
166         char *ret = NULL;\r
167         char *title_a;\r
168         if (UniIsEmptyStr(title))\r
169         {\r
170                 title = NULL;\r
171         }\r
172         if (IsEmptyStr(default_dir))\r
173         {\r
174                 default_dir = NULL;\r
175         }\r
176 \r
177         Zero(&data, sizeof(data));\r
178         data.default_dir = CopyStrToUni(default_dir);\r
179 \r
180         Zero(display_name, sizeof(display_name));\r
181         Zero(&info, sizeof(info));\r
182         info.hwndOwner = hWnd;\r
183         info.pidlRoot = NULL;\r
184         info.pszDisplayName = display_name;\r
185         title_a = CopyUniToStr(title);\r
186         info.lpszTitle = title_a;\r
187         info.ulFlags = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS | BIF_VALIDATE | BIF_SHAREABLE;\r
188         info.lpfn = FolderDlgInnerCallbackA;\r
189         info.lParam = (LPARAM)&data;\r
190 \r
191         if (SUCCEEDED(SHGetMalloc(&pMalloc)))\r
192         {\r
193                 LPITEMIDLIST pidl;\r
194 \r
195                 pidl = SHBrowseForFolderA(&info);\r
196 \r
197                 if (pidl)\r
198                 {\r
199                         char tmp[MAX_PATH];\r
200 \r
201                         if (SHGetPathFromIDListA(pidl, tmp))\r
202                         {\r
203                                 ret = CopyStr(tmp);\r
204                         }\r
205 \r
206                         pMalloc->Free(pidl);\r
207                 }\r
208 \r
209                 pMalloc->Release();\r
210         }\r
211 \r
212         Free(data.default_dir);\r
213         Free(title_a);\r
214 \r
215         return ret;\r
216 }\r
217 \r
218 int CALLBACK FolderDlgInnerCallbackW(HWND hWnd, UINT msg, LPARAM lParam, LPARAM lData)\r
219 {\r
220         FOLDER_DLG_INNER_DATA *data = (FOLDER_DLG_INNER_DATA *)lData;\r
221         LPITEMIDLIST pidl;\r
222 \r
223         switch (msg)\r
224         {\r
225         case BFFM_INITIALIZED:\r
226                 if (data->default_dir != NULL)\r
227                 {\r
228                         SendMessage(hWnd, BFFM_SETSELECTIONW, true, (LPARAM)data->default_dir);\r
229                 }\r
230                 break;\r
231 \r
232         case BFFM_SELCHANGED:\r
233                 pidl = (LPITEMIDLIST)lParam;\r
234 \r
235                 if (pidl)\r
236                 {\r
237                         wchar_t tmp[MAX_PATH];\r
238 \r
239                         Zero(tmp, sizeof(tmp));\r
240                         if (SHGetPathFromIDListW(pidl, tmp))\r
241                         {\r
242                                 SendMessage(hWnd, BFFM_ENABLEOK, 0, 1);\r
243                         }\r
244                         else\r
245                         {\r
246                                 SendMessage(hWnd, BFFM_ENABLEOK, 0, 0);\r
247                         }\r
248                 }\r
249                 break;\r
250         }\r
251 \r
252         return 0;\r
253 }\r
254 \r
255 wchar_t *FolderDlgInnerW(HWND hWnd, wchar_t *title, wchar_t *default_dir)\r
256 {\r
257         BROWSEINFOW info;\r
258         wchar_t display_name[MAX_PATH];\r
259         FOLDER_DLG_INNER_DATA data;\r
260         LPMALLOC pMalloc;\r
261         wchar_t *ret = NULL;\r
262         if (UniIsEmptyStr(title))\r
263         {\r
264                 title = NULL;\r
265         }\r
266         if (UniIsEmptyStr(default_dir))\r
267         {\r
268                 default_dir = NULL;\r
269         }\r
270 \r
271         Zero(&data, sizeof(data));\r
272         data.default_dir = default_dir;\r
273 \r
274         Zero(display_name, sizeof(display_name));\r
275         Zero(&info, sizeof(info));\r
276         info.hwndOwner = hWnd;\r
277         info.pidlRoot = NULL;\r
278         info.pszDisplayName = display_name;\r
279         info.lpszTitle = title;\r
280         info.ulFlags = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS | BIF_VALIDATE | BIF_SHAREABLE;\r
281         info.lpfn = FolderDlgInnerCallbackW;\r
282         info.lParam = (LPARAM)&data;\r
283 \r
284         if (SUCCEEDED(SHGetMalloc(&pMalloc)))\r
285         {\r
286                 LPITEMIDLIST pidl;\r
287 \r
288                 pidl = SHBrowseForFolderW(&info);\r
289 \r
290                 if (pidl)\r
291                 {\r
292                         wchar_t tmp[MAX_PATH];\r
293 \r
294                         if (SHGetPathFromIDListW(pidl, tmp))\r
295                         {\r
296                                 ret = CopyUniStr(tmp);\r
297                         }\r
298 \r
299                         pMalloc->Free(pidl);\r
300                 }\r
301 \r
302                 pMalloc->Release();\r
303         }\r
304 \r
305         return ret;\r
306 }\r
307 \r
308 \r
309 class CModule\r
310 {\r
311 public:\r
312     CModule()\r
313     {\r
314         m_hInstLib = NULL;\r
315     }\r
316     CModule( HINSTANCE hInstLib )\r
317     {\r
318         m_hInstLib = NULL;\r
319         this->Attach( hInstLib );\r
320     }\r
321     CModule( LPCTSTR pszModuleName )\r
322     {\r
323         m_hInstLib = NULL;\r
324         this->LoadLibrary( pszModuleName );\r
325     }\r
326     virtual ~CModule()\r
327     {\r
328         this->FreeLibrary();\r
329     }\r
330 \r
331 public:\r
332     BOOL Attach( HINSTANCE hInstLib )\r
333     {\r
334         this->FreeLibrary();\r
335         m_hInstLib = hInstLib;\r
336        \r
337         return TRUE;\r
338     }\r
339     BOOL Detach()\r
340     {\r
341         m_hInstLib = NULL;\r
342        \r
343         return TRUE;\r
344     }\r
345 \r
346 public:\r
347     HMODULE GetHandle()\r
348     {\r
349         return m_hInstLib;\r
350     }\r
351     // DLLのロード\r
352     HINSTANCE LoadLibrary( LPCTSTR pszModuleName )\r
353     {\r
354         this->FreeLibrary();\r
355         m_hInstLib = ::LoadLibrary( pszModuleName );\r
356        \r
357         return m_hInstLib;\r
358     }\r
359     // DLLの開放\r
360     BOOL FreeLibrary()\r
361     {\r
362         if (m_hInstLib == NULL)\r
363         {\r
364             return FALSE;\r
365         }\r
366        \r
367         BOOL bResult = ::FreeLibrary( m_hInstLib );\r
368         m_hInstLib = NULL;\r
369        \r
370         return bResult;\r
371     }\r
372     // 関数のアドレスの取得\r
373     FARPROC GetProcAddress( LPCTSTR pszProcName )\r
374     {\r
375         if (m_hInstLib == NULL)\r
376         {\r
377             return NULL;\r
378         }\r
379        \r
380         return ::GetProcAddress(m_hInstLib, pszProcName);\r
381     }\r
382     // 指定されたタイプおよび名前を持つリソースの情報ブロックのハンドルを取得\r
383     HRSRC FindResource(LPCTSTR lpName, LPCTSTR lpType)\r
384     {\r
385         if (m_hInstLib == NULL)\r
386         {\r
387             return NULL;\r
388         }\r
389        \r
390         return ::FindResource(m_hInstLib, lpName, lpType);\r
391     }\r
392     // 指定されたリソースのロード\r
393     HGLOBAL LoadResource(HRSRC hResInfo)\r
394     {\r
395         if (m_hInstLib == NULL)\r
396         {\r
397             return NULL;\r
398         }\r
399        \r
400         return ::LoadResource(m_hInstLib, hResInfo);\r
401     }\r
402 \r
403 protected:\r
404     HINSTANCE m_hInstLib;\r
405 };\r
406 \r
407 \r
408 \r
409 static HRESULT _ShowHTMLDialog(\r
410     HWND hwndParent,\r
411     IMoniker* pMk,\r
412     VARIANT* pvarArgIn = NULL,\r
413     WCHAR* pchOptions = NULL,\r
414     VARIANT* pvarArgOut = NULL)\r
415 {\r
416     HRESULT hr = S_OK;\r
417    \r
418     try\r
419     {\r
420         CModule Module("MSHTML.DLL");\r
421         if (Module.GetHandle() == NULL)\r
422         {\r
423             return E_FAIL;\r
424         }\r
425        \r
426         SHOWHTMLDIALOGFN* fnShowHTMLDialog =\r
427             (SHOWHTMLDIALOGFN*)Module.GetProcAddress("ShowHTMLDialog");\r
428         if (fnShowHTMLDialog == NULL)\r
429         {\r
430             return E_FAIL;\r
431         }\r
432        \r
433         hr = (*fnShowHTMLDialog)(hwndParent, pMk, pvarArgIn, pchOptions, pvarArgOut);\r
434         if (FAILED(hr))\r
435         {\r
436             return hr;\r
437         }\r
438     }\r
439     catch (...)\r
440     {\r
441         return E_FAIL;\r
442     }\r
443    \r
444     return hr;\r
445 }\r
446 \r
447 HRESULT ShowHTMLDialogFromURL(HWND hwndParent,wchar_t *szURL,VARIANT* pvarArgIn,WCHAR* pchOptions,VARIANT* pvarArgOut)\r
448 {\r
449     HRESULT hr = S_OK;\r
450    \r
451     try\r
452     {\r
453         IMonikerPtr spMoniker;\r
454         hr = ::CreateURLMoniker(NULL, szURL, &spMoniker);\r
455         if (FAILED(hr))\r
456         {\r
457             return hr;\r
458         }\r
459        \r
460         hr = ::_ShowHTMLDialog(hwndParent, spMoniker, pvarArgIn, pchOptions, pvarArgOut);\r
461         if (FAILED(hr))\r
462         {\r
463             return hr;\r
464         }\r
465     }\r
466     catch (...)\r
467     {\r
468         return E_FAIL;\r
469     }\r
470    \r
471     return hr;\r
472 }\r
473 \r
474 // ショートカットの作成\r
475 bool CreateLinkInnerA(char *filename, char *target, char *workdir, char *args,\r
476                                      char *comment, char *icon, UINT icon_index)\r
477 {\r
478         HRESULT r;\r
479         wchar_t tmp[MAX_SIZE];\r
480         IShellLinkA* pShellLink;\r
481         IPersistFile* pPersistFile;\r
482 \r
483         r = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkA, (void **)&pShellLink);\r
484         if (FAILED(r))\r
485         {\r
486                 return false;\r
487         }\r
488 \r
489         r = pShellLink->QueryInterface(IID_IPersistFile,(void **)&pPersistFile);\r
490         if (FAILED(r))\r
491         {\r
492                 pShellLink->Release();\r
493                 return false;\r
494         }\r
495 \r
496         r = pShellLink->SetPath(target);\r
497         if (FAILED(r))\r
498         {\r
499                 pShellLink->Release();\r
500                 pPersistFile->Release();\r
501                 return false;\r
502         }\r
503 \r
504         if (workdir != NULL)\r
505         {\r
506                 r = pShellLink->SetWorkingDirectory(workdir);\r
507                 if (FAILED(r))\r
508                 {\r
509                         pShellLink->Release();\r
510                         pPersistFile->Release();\r
511                         return false;\r
512                 }\r
513         }\r
514 \r
515         if (args != NULL)\r
516         {\r
517                 r = pShellLink->SetArguments(args);\r
518                 if (FAILED(r))\r
519                 {\r
520                         pShellLink->Release();\r
521                         pPersistFile->Release();\r
522                         return false;\r
523                 }\r
524         }\r
525 \r
526         if (comment != NULL)\r
527         {\r
528                 r = pShellLink->SetDescription(comment);\r
529                 if (FAILED(r))\r
530                 {\r
531                         pShellLink->Release();\r
532                         pPersistFile->Release();\r
533                         return false;\r
534                 }\r
535         }\r
536 \r
537         if (icon != NULL)\r
538         {\r
539                 r = pShellLink->SetIconLocation(icon, icon_index);\r
540                 if (FAILED(r))\r
541                 {\r
542                         pShellLink->Release();\r
543                         pPersistFile->Release();\r
544                         return false;\r
545                 }\r
546         }\r
547 \r
548         StrToUni(tmp, sizeof(tmp), filename);\r
549         r = pPersistFile->Save(tmp, true);\r
550         if (FAILED(r))\r
551         {\r
552                 pShellLink->Release();\r
553                 pPersistFile->Release();\r
554                 return false;\r
555         }\r
556 \r
557         pShellLink->Release();\r
558         pPersistFile->Release();\r
559         return true;\r
560 }\r
561 bool CreateLinkInner(wchar_t *filename, wchar_t *target, wchar_t *workdir, wchar_t *args,\r
562                                      wchar_t *comment, wchar_t *icon, UINT icon_index)\r
563 {\r
564         HRESULT r;\r
565         bool ret;\r
566         IShellLinkW* pShellLink;\r
567         IPersistFile* pPersistFile;\r
568 \r
569         if (OS_IS_WINDOWS_9X(GetOsInfo()->OsType))\r
570         {\r
571                 char *a1, *a2, *a3, *a4, *a5, *a6;\r
572                 a1 = CopyUniToStr(filename);\r
573                 a2 = CopyUniToStr(target);\r
574                 a3 = CopyUniToStr(workdir);\r
575                 a4 = CopyUniToStr(args);\r
576                 a5 = CopyUniToStr(icon);\r
577                 a6 = CopyUniToStr(comment);\r
578 \r
579                 ret = CreateLinkInnerA(a1, a2, a3, a4, a6, a5, icon_index);\r
580 \r
581                 Free(a1);\r
582                 Free(a2);\r
583                 Free(a3);\r
584                 Free(a4);\r
585                 Free(a5);\r
586                 Free(a6);\r
587 \r
588                 return ret;\r
589         }\r
590 \r
591         r = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void **)&pShellLink);\r
592         if (FAILED(r))\r
593         {\r
594                 return false;\r
595         }\r
596 \r
597         r = pShellLink->QueryInterface(IID_IPersistFile,(void **)&pPersistFile);\r
598         if (FAILED(r))\r
599         {\r
600                 pShellLink->Release();\r
601                 return false;\r
602         }\r
603 \r
604         r = pShellLink->SetPath(target);\r
605         if (FAILED(r))\r
606         {\r
607                 pShellLink->Release();\r
608                 pPersistFile->Release();\r
609                 return false;\r
610         }\r
611 \r
612         if (workdir != NULL)\r
613         {\r
614                 r = pShellLink->SetWorkingDirectory(workdir);\r
615                 if (FAILED(r))\r
616                 {\r
617                         pShellLink->Release();\r
618                         pPersistFile->Release();\r
619                         return false;\r
620                 }\r
621         }\r
622 \r
623         if (comment != NULL)\r
624         {\r
625                 r = pShellLink->SetDescription(comment);\r
626                 if (FAILED(r))\r
627                 {\r
628                         pShellLink->Release();\r
629                         pPersistFile->Release();\r
630                         return false;\r
631                 }\r
632         }\r
633 \r
634         if (args != NULL)\r
635         {\r
636                 r = pShellLink->SetArguments(args);\r
637                 if (FAILED(r))\r
638                 {\r
639                         pShellLink->Release();\r
640                         pPersistFile->Release();\r
641                         return false;\r
642                 }\r
643         }\r
644 \r
645         if (icon != NULL)\r
646         {\r
647                 r = pShellLink->SetIconLocation(icon, icon_index);\r
648                 if (FAILED(r))\r
649                 {\r
650                         pShellLink->Release();\r
651                         pPersistFile->Release();\r
652                         return false;\r
653                 }\r
654         }\r
655 \r
656         r = pPersistFile->Save(filename, true);\r
657         if (FAILED(r))\r
658         {\r
659                 pShellLink->Release();\r
660                 pPersistFile->Release();\r
661                 return false;\r
662         }\r
663 \r
664         pShellLink->Release();\r
665         pPersistFile->Release();\r
666         return true;\r
667 }\r
668 \r
669 extern "C"\r
670 {\r
671 \r
672 // フォルダ選択ダイアログの表示\r
673 wchar_t *FolderDlgW(HWND hWnd, wchar_t *title, wchar_t *default_dir)\r
674 {\r
675         wchar_t *ret;\r
676 \r
677         if (MsIsNt() == false)\r
678         {\r
679                 char *default_dir_a = CopyUniToStr(default_dir);\r
680                 char *ret_a = FolderDlgA(hWnd, title, default_dir_a);\r
681 \r
682                 ret = CopyStrToUni(ret_a);\r
683                 Free(ret_a);\r
684                 Free(default_dir_a);\r
685 \r
686                 return ret;\r
687         }\r
688 \r
689         ret = FolderDlgInnerW(hWnd, title, default_dir);\r
690 \r
691         return ret;\r
692 }\r
693 char *FolderDlgA(HWND hWnd, wchar_t *title, char *default_dir)\r
694 {\r
695         char *ret;\r
696 \r
697         ret = FolderDlgInnerA(hWnd, title, default_dir);\r
698 \r
699         return ret;\r
700 }\r
701 \r
702 // ショートカットの作成\r
703 bool CreateLink(wchar_t *filename, wchar_t *target, wchar_t *workdir, wchar_t *args,\r
704                                 wchar_t *comment, wchar_t *icon, UINT icon_index)\r
705 {\r
706         if (filename == NULL || target == NULL)\r
707         {\r
708                 return false;\r
709         }\r
710 \r
711         return CreateLinkInner(filename, target, workdir, args, comment, icon, icon_index);\r
712 }\r
713 \r
714 // HTML の表示\r
715 void ShowHtml(HWND hWnd, char *url, wchar_t *option)\r
716 {\r
717         wchar_t tmp[MAX_SIZE];\r
718         // 引数チェック\r
719         if (url == NULL || option == NULL)\r
720         {\r
721                 return;\r
722         }\r
723 \r
724         StrToUni(tmp, sizeof(tmp), url);\r
725 \r
726         ShowHTMLDialogFromURL(hWnd, tmp, NULL, option, NULL);\r
727 }\r
728 \r
729 }\r
730 \r
731 #endif\r