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>
むずでょ