tag:crieit.net,2005:https://crieit.net/tags/CgfGoBan/feed 「CgfGoBan」の記事 - Crieit Crieitでタグ「CgfGoBan」に投稿された最近の記事 2023-10-22T04:07:00+09:00 https://crieit.net/tags/CgfGoBan/feed tag:crieit.net,2005:PublicArticle/18623 2023-10-22T01:56:36+09:00 2023-10-22T04:07:00+09:00 https://crieit.net/posts/CgfGoBan112 CgfGoBan112を改造しようぜ(^~^)? (2023年) <h1 id="他の記事"><a href="#%E4%BB%96%E3%81%AE%E8%A8%98%E4%BA%8B">他の記事</a></h1> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://qiita.com/muzudho1/items/35941c1e56d7a5b0d0e9">CGFGoban109を改造しようぜ☆(^~^)</a></p> <h1 id="cgfthink"><a href="#cgfthink">cgfthink</a></h1> <h2 id="x86"><a href="#x86">x86</a></h2> <p>多分、 cgfgoban.exe が恐らく x86 なので、 cgfthink.dll も x64 ではなく <strong>x86</strong> で作らなければいけないと思う</p> <h2 id="構成の種類"><a href="#%E6%A7%8B%E6%88%90%E3%81%AE%E7%A8%AE%E9%A1%9E">構成の種類</a></h2> <p>アプリケーション( <code>.exe</code> )ではなく <strong>ダイナミック ライブラリ</strong> ( <code>.dll</code> )に変更</p> <h2 id="ヘッダーファイルが読み込めない場合"><a href="#%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%81%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88">ヘッダーファイルが読み込めない場合</a></h2> <p><code>cgfthink.h</code> が上手く読み込めない場合は、 <code>#include "cgfthink.h"</code> の箇所に そのファイルの内容をベタ書きする</p> <h2 id="cgfthink.c ファイルのエンコード"><a href="#cgfthink.c+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89">cgfthink.c ファイルのエンコード</a></h2> <p>UTF-8 with BOM</p> <h2 id="CgfGoBanで cgfthink.dll を使って対局するときは"><a href="#CgfGoBan%E3%81%A7+cgfthink.dll+%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%AF%BE%E5%B1%80%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AF">CgfGoBanで cgfthink.dll を使って対局するときは</a></h2> <p><code>Computer(GTP)</code> ではなく <code>Computer(DLL)</code> を選ぶ</p> <h2 id="文字化けを直す"><a href="#%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%82%92%E7%9B%B4%E3%81%99">文字化けを直す</a></h2> <p>以下のように直せばいいが、関連する他の箇所も直さないといけない。自力で頑張って欲しい。説明省略</p> <pre><code class="cpp">// printf()の代用関数。 void PRT(const wchar_t* fmt, ...) { // 可変長引数か? va_list ap; int len; static wchar_t text[PRT_LEN_MAX]; DWORD nw; if (hOutput == INVALID_HANDLE_VALUE) return; va_start(ap, fmt); len = _vsnwprintf_s(text, PRT_LEN_MAX - 1, _TRUNCATE, fmt, ap); va_end(ap); if (len < 0 || len >= PRT_LEN_MAX) return; WriteConsole(hOutput, text, (DWORD)wcslen(text), &nw, NULL); } </code></pre> <h2 id="const char*"><a href="#const+char%2A">const char*</a></h2> <p>Original:</p> <pre><code class="cpp"> char* str[4] = { "・","●","○","+" }; </code></pre> <p>Refactoring:</p> <pre><code class="cpp"> const char* str[4] = { "・","●","○","+" }; </code></pre> <h2 id="LPCWSTR"><a href="#LPCWSTR">LPCWSTR</a></h2> <p>Original:</p> <pre><code class="cpp">SetConsoleTitle("CgfgobanDLL Infomation Window"); ```` Refactoring: ```cpp // 関数名の末尾にA が付いた SetConsoleTitleA("CgfgobanDLL Infomation Window"); </code></pre> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/13219182/set-console-title-in-c-using-a-string">Set console title in C++ using a string</a></p> <h2 id="_vsnprintf"><a href="#_vsnprintf">_vsnprintf</a></h2> <p>Original:</p> <pre><code class="cpp"> len = _vsnprintf(text, PRT_LEN_MAX - 1, fmt, ap); </code></pre> <p>Refactoring:</p> <pre><code class="cpp"> // 関数名に w が含まれ、末尾に _s が付いた // _TRUNCATE という引数が増えた len = _vsnwprintf_s(text, PRT_LEN_MAX - 1, _TRUNCATE, fmt, ap); </code></pre> <h2 id="Fail GetProcAddress() .. 2"><a href="#Fail+GetProcAddress%28%29+..+2">Fail GetProcAddress() .. 2</a></h2> <p>多分、もともと <code>.c</code> のファイルを <code>.cpp</code> にすると おかしくなるのかもしれない。</p> <h1 id="cgfgoban"><a href="#cgfgoban">cgfgoban</a></h1> <p><strong>大変なのでcgfgoban.cppは改造しない方がいい</strong></p> <h2 id="st"><a href="#st">st</a></h2> <p><strong>大変なのでcgfgoban.cppは改造しない方がいい</strong></p> <p>Original:</p> <p>```c++<br /> char *st[5] = { "+","●","○","★","☆" }; // 埋まったのが黒。空洞が白</p> <pre><code><br />Refactoring: ```c++ const char *st[5] = { "+","●","○","★","☆" }; // 埋まったのが黒。空洞が白 </code></pre> <p>他同様</p> <h2 id="sBC"><a href="#sBC">sBC</a></h2> <p><strong>大変なのでcgfgoban.cppは改造しない方がいい</strong></p> <p>Original:</p> <p>```c++<br /> static char *sBC[SBC_NUM] = {<br /> "●","◆","★",<br /> "○","◇","☆","◯", // 0x819b, 0x81fc,コードが違う。<br /> "┏","┯","┓",<br /> "┠","┼","┨",<br /> "┗","┷","┛",<br /> "・","-","+",<br /> "|","-","+",<br /> "┌","┬","┐",<br /> "├","╋","┤",<br /> "└","┴","┘",</p> <p>};</p> <pre><code><br />Refactoring: ```c++ static const wchar_t *sBC[SBC_NUM] = { L"●",L"◆",L"★", L"○",L"◇",L"☆",L"◯", // 0x819b, 0x81fc,コードが違う。 L"┏",L"┯",L"┓", L"┠",L"┼",L"┨", L"┗",L"┷",L"┛", L"・",L"-",L"+", L"|",L"-",L"+", L"┌",L"┬",L"┐", L"├",L"╋",L"┤", L"└",L"┴",L"┘", }; </code></pre> <p>他同様</p> <h2 id="PRT"><a href="#PRT">PRT</a></h2> <p><strong>大変なのでcgfgoban.cppは改造しない方がいい</strong></p> <p>Original:</p> <p>```c++<br /> void PRT(char *fmt, ...); // 可変のリストを持つprintf代用関数</p> <pre><code><br />Refactoring: ```c++ void PRT(const char *fmt, ...); // 可変のリストを持つprintf代用関数 </code></pre> <h2 id="文字列"><a href="#%E6%96%87%E5%AD%97%E5%88%97">文字列</a></h2> <p><strong>大変なのでcgfgoban.cppは改造しない方がいい</strong></p> <p>Original:</p> <p>```c++<br /> MessageBox( ghWindow, "CgfGoBan's Internal Error!\nIf you push OK, Program will be terminated by force.", "Debug!", MB_OK);</p> <pre><code><br />Refactoring: ```c++ // 文字列の頭に L を付けた MessageBox( ghWindow, L"CgfGoBan's Internal Error!\nIf you push OK, Program will be terminated by force.", L"Debug!", MB_OK); </code></pre> <p>他同様</p> <h2 id="LPSTR, LPWSTR"><a href="#LPSTR%2C+LPWSTR">LPSTR, LPWSTR</a></h2> <p><strong>大変なのでcgfgoban.cppは改造しない方がいい</strong></p> <p>Original:</p> <p>```c++<br /> LPSTR lpStr;</p> <pre><code><br />Refactoring: ```c++ // W が付いている方に思い切って変える LPWSTR lpwStr; </code></pre> <p>他同様</p> <h2 id="char xTmp[256]"><a href="#char+xTmp%5B256%5D">char xTmp[256]</a></h2> <p><strong>大変なのでcgfgoban.cppは改造しない方がいい</strong></p> <p>Original:</p> <p>```c++<br /> char sTmp[256];</p> <pre><code><br />Refactoring: ```c++ // 仕方ないので、思い切って変える wchar_t sTmp[256]; </code></pre> <p>Original:</p> <p>```c++<br /> sprintf( sTmp,"%d手",tesuu);</p> <pre><code><br />Refactoring: ```c++ wsprintf( sTmp,L"%d手",tesuu); </code></pre> <p>Original:</p> <p>```c++<br /> nLen = strlen( lpwStr );</p> <pre><code><br />Refactoring: ```c++ nLen = wcslen( lpwStr ); </code></pre> <p>📖 <a target="_blank" rel="nofollow noopener" href="https://learn.microsoft.com/ja-jp/cpp/c-runtime-library/reference/vsnprintf-s-vsnprintf-s-vsnprintf-s-l-vsnwprintf-s-vsnwprintf-s-l?view=msvc-170">vsnprintf_s, _vsnprintf_s, _vsnprintf_s_l, _vsnwprintf_s, _vsnwprintf_s_l</a></p> <p>Original:</p> <p>```c++<br /> for (k=0;k<SBC_NUM;k++) if ( strncmp(p,sBC[k],2) == 0 ) break;</p> <pre><code><br />Refactoring: ```c++ for (k=0;k<SBC_NUM;k++) if ( wcsncmp(p,sBC[k],2) == 0 ) break; </code></pre> <p>芋づる式に変える</p> <h2 id="strcpy"><a href="#strcpy">strcpy</a></h2> <p><strong>大変なのでcgfgoban.cppは改造しない方がいい</strong></p> <p>Original:</p> <p><code>c++ strcpy(lpStr,SgfBuf);</code></p> <p>.</p> むずでょ