2574 への返信

UNICODE文字はDLLから吐けないのでしょうかtok - No.2574
はじめまして。友人に頼まれDLLを作成している者です。
表題のことに関しまして質問させていただきます。

DLL側で用意する関数は

extern "C" __declspec(dllexport) void Function(const char* Input, char* Output)

となっていますが、Outputにwchar_t*を渡すことは出来ないのでしょうか。
UNICODE文字(ハートマーク等)を含んだ文字列をチャット画面に吐き出したいのですが、その場合wchar_t*を渡さないといけないと思います。

この辺りのご事情ご存知の方いらっしゃいましたら
どうかご教授願えましたら幸いです。
tok - No.2583
大分前に自己解決(?)しました。フィードバックとして書き込みます。

まず私の言った wchar_t* というのは見当違いで、これは私が内部的に使っているUTF-16での話でした。UTF-8は char* で良いのです。

そしてUTF-8を送信することはやめにしました。
というのはLimeChatの初期設定がUTF-8ではありませんから、それらを表示させるにはユーザ側に設定を変えてもらわないといけません。
これは可用性に欠けます。
そしてその機能は作っているDLLに必要不可欠ではありませんからこの処理は作らないことにしました。

他はすべてうまく行きました。


続いてBBSで検索しても見つからず自己解決した問題を書きます。


■ DllHook で利用するDLLの書き方
マクロの設定で「動作」を DllHook にした場合、「動作の情報」の所に入れる文字列はDLL内の「関数名」に対応します。
1つのDLLに複数の機能を持たせる場合は、プロトタイプ宣言で提示される引数(TrailやSenderAddress等)を持った別名の関数をたくさん作り、「動作の情報」でそれを指定すれば1つのDLLで複数の機能を持たせることが可能です。

■ 32bitビルドと64bitビルド
32bit版のLimeChat用のDLLを制作する場合はDLLも32bit版である必要があります。
64bit版のLimeChat用のDLLを制作する場合はDLLも64bit版である必要があります。

これを違えた場合、DLLは何も動作せずそのまま終了します。
例を出しますとRoart様制作の「ろあダイス」に添付されているDLLは32bit版ですから64bit版LimeChatでは動作しません。添付されているソースを利用させていただき、64bit版DLLを新たにビルドする必要があります。
(この辺はプログラム普段からいじってる方には今更情報ですが、Win7でx64を初体験している方も多かろうということで...)

※例外として、.NETを使うDLLであれば対象CPUをAnyCPUにすることで32bit/64bit両対応のDLLが作成出来るようです。私は過去に.NETを使ったプログラムを作りリアルタイム性の限界(GC利用による定期スワップで一瞬画面が止まる。ゲーム制作に適さない)を感じたためそれ以来GCという存在ごと大嫌いになり使っておりませんから、実際の動作がどうかはわかりません。

■ 複数行のメッセージを送る場合
ヘルプに「また、返値をCR LFのシーケンスで区切ることで、複数のメッセージを一度に送れます。」
とありますがこれは \r\n の後にそのまま返す文字列を続けて良いという意味ではありません。
例えばNOTICEメッセージを複数行表示させる場合には、都度Noticeから始まる命令語を入れなければエラーになります。

即ち 「\r\n」 を 「\r\nNotice #channel :」に置き換える必要があります。

ドキュメントの「複数のメッセージ」は「複数行のメッセージ」ではなく「複数種のメッセージ」と読み替えないといけない、ということです。


以上です。
どなたかのお役に立てれば幸いです。

以下の項目を必ず守ってください。守っていない書き込みは無視されるかも知れません。

あなたにとっては1回の質問でも、答える側は1回ではないことを理解してください。

  • 文章はきちんと状況が伝わるように丁寧に書いてください。
  • 話し言葉での書き込みは禁止します。
  • 過去ログを検索して確認してから書き込んでください。
  • 内容がわかるタイトルをつけること。要望する場合は[要望]を先頭につけること。
  • 動作確認はかならず最新版で行ってください。
  • 不適切な文章は、管理人が削除、編集することがあります。
名前*
メッセージ*
パスワード (編集・削除に使用。16文字以内)