554 への返信

DLLについてCelen - No.554
いつもLimeChatを使わせていただいています。
今回、初めてマクロを組もうと先日からヘルプやWeb上の情報を診つつ試行錯誤をくりかえしています。

DLLを使った複数行の文字列を返すマクロを組もうと思うのですが、上手くいきません。
よければアドバイス等を頂けないでしょうか?

extern "C" __declspec(dllexport)

void __cdecl func(const char* Input, char* Output)
{
lstrcpy(Output, "テスト\n改行\nされているか?");
}

マクロ項目
コマンド:Privmsg
メッセージ:\test
動作:Raw
$DllFunc(mydll.dll,Func,%m)

dll名:mydll.dll

―――予定の結結果―――
テスト
改行
されているか?
――――――――――――

宜しくお願い致します。
もし、ここで聞くような事ではないのでしたらスイマセン。
ひゅー - No.555
ヘルプ内で改行は「CR LF」となっていますので、「\r\n」でないと改行されません。
また、動作がRawですので、IRCのコマンドも出力する必要があります。
例えば#channelで改行して発言したい場合、lstrcpyする文字列を

privmsg #channel テスト\nprivmsg #channel 改行\nprivmsg #channel されているか?

などにすれば良いと思います。
Celen - No.556
ひゅーさん、返信有難うございます。
おかげである程度理解出来てきたのですが、ちょっと問題が。

もしかしたら私はとんでもない勘違いをしていたのかもしれませんが、
DLLファイルってテキストファイルに書き込んで、.dll形式で保存するだけではなく、
いちいちコンパイルしなくてはいけないのでしょうか?
よければお答えをお願い致します。
ひゅー - No.557
お察しの通り、DLLはEXEファイルと同じようにコンパイルが必要です。
Cコンパイラをお持ちでないのでしたら、フリーのコンパイラが出回っていますので、
検索してみることをおすすめします。
Celen - No.558
やはりそうでしたか、失礼しました。
CコンパイラはボーランドのやVC++があるので大丈夫です。

そこで、最後にもう一つだけ教えて頂きたいことが。
今までDLL関係のプログラムを作ったことがなく、今回が初めてなのですが、
DLL等のものを作る上で参考になりそうなWebサイトを探しています。

今の所、私が見つけた所で参考になりそうなサイトが
http://www.ceres.dti.ne.jp/~sugiura/hidemaru/qa/make_dll.html
http://www.kumei.ne.jp/c_lang/bcc/bcc_11.htm
の2件ぐらいしかありません。
もし何処か良さそうなサイトをお知りになっていれば教えていただけないでしょうか?

上で書いた
extern "C" __declspec(dllexport)
void __cdecl func(const char* Input, char* Output)
{lstrcpy(Output, "テスト\n改行\nされているか?");}
という内側ではなく、コンパイル時に必要な外側(?)がどうしても分かりづらいので、
もしその辺りの助言もして頂けると助かります。
ひゅー - No.559
私自身C言語に詳しいわけではないのですが、VCで確認したところソースの一番上に
#include <windows.h>
を付け加えるだけでコンパイルは出来ました。
その際、ソースの拡張子をcppにしないとエラーが出るようでした。
Celen - No.560
幾度もの返答、本当にありがとうございます。
やっとコンパイルまでこぎつける事が出来ました。

先ほどので最後と言っておきながらなんですが、どうしても分からない為、今回で本当に最後に致します。

コンパイルまでは成功し、コンパイル前のソース
/*mydll.dll*/

#include <windows.h>
extern "C" __declspec(dllexport)
void __cdecl Func(const char* Input, char* Output);

void __cdecl Func(const char* Input, char* Output)
{
lstrcpy(Output, "privmsg #--- テスト\r\n privmsg #-- 改行\r\n privmsg #-- されているか?");
}
これをコンパイル、メイクしたdllファイルを使っても動いてくれません。
もし、このソースがプログラム的に間違っているのであればどう修正すれば良いのでしょうか?
それとも、マクロ項目の

ユーザー:%me|*
コマンド:Privmsg
メッセージ:\test
動作:Raw
$DllFunc(mydll.dll,Func,%m)

この設定がおかしいのでしょうか?
ここさえ分かれば、あとはこれを応用して別の物を作っていけると思うんです。

最後の質問、どうか宜しくお願い致します。
ご迷惑お掛けして申し訳ありません。
ひゅー - No.561
この設定ですと、誰かが自分に「\test」と話しかけてきた場合に反応します。

発言欄に「/test」と打って動かしたいのならば
コマンド:test
メッセージ:(空欄)
とすれば良いでしょう。
Celen - No.562
……やはり動きませんね。

ユーザー:%me|*
コマンド:test
メッセージ:
動作:Raw
$DllFunc(mydll.dll,Func,%m)

言われたようにしてみましたがエラーすら出ない。
一体何が問題なのか分からず。

ひとまず、何度も返信して頂きありがとうございました。
あとは別のサイト等を見てもう少し自分で調べてみようと思います。
Psychs - No.563
まずはDLLを呼ばずに通常のマクロで反応することを試してから、
DLLの関数を呼んでみてください。

以下のマクロを作ります。

ユーザー:%me
コマンド:test
メッセージ:
動作:Raw
動作の情報: Privmsg #channelname :test

マクロの設定ダイアログですべてのサーバに「○」をつけて
有効にしてから、メインウィンドウの入力欄で「/test」と
送信してみてください。

#channelname というチャンネルに入っていれば、そのチャンネルで
発言をするはずです。入ってなければエラーが返ってきます。

ここまで動くことを確認してから、$DllFunc でDLL内の関数を呼べるか試してみてください。
Celen - No.566
返信ありがとうございます。

書かれた内容のマクロを作ってみると、正常に動作致しました。
しかし、やはりDLLの関数を呼ぶ
$DllFuc(mydll.dll,Func,%m)
を使うと正常に動いてくれないようです。
Azif - No.607
 始めまして、回答・アドバイスではないので、Celenさんにとって不愉快かもしれません。ですが、同じ話題で新しく投稿するのも失礼だと思いましたので、此方にレスの形で質問させていただきます。
 
 自分も最近マクロを自作しようとしているのですが、Celenさんと同じように動いてくれません。
 何方か問題の解決方法をご存知の方がいらっしゃれば、教えていただけないでしょうか?
----------mydll2.cpp-------------------------------------
//mydll2.dll

#include <windows.h>
extern "C"
__declspec(dllexport)
void __cdecl mozi(const char* Input, char* Output);

void __cdecl mozi(const char* Input, char* Output)
{
lstrcpy(Output, "マクロテスト");
}
-----------------------------------------------------------
マクロ項目
ユーザー   $NOT |*
コマンド   Privmsg
メッセージ  *マクロテスト1*
動作     Raw
Privmsg %c $DllFunc(mydll2.dll,mozi,%m)

dll      mydll2.dll
-----------------------------------------------------------
予想結果
[マクロテスト]と表示
-----------------------------------------------------------
使用コンパイラはBCCです。
-----------------------------------------------------------
実際の動作
反応なし
-----------------------------------------------------------
 何方かこの問題の解決方法をご存知の方がいらっしゃいましたら、教えてください。
Psychs - No.611
とりあえず、ユーザ欄を「%me|*」にして、自分を含むすべてのユーザに
マッチするようにしてみてください。
原因がDLL側にあるのか、まずはできるだけ条件をゆるめて
呼び出してみるということです。

それで動作しなければ、mydll2.cpp のファイル名を mydll2.c などに
変えてみてください。
ファイル名を .cpp にすると、シンボルテーブルを C++ 形式で
持ってしまうコンパイラがあるようなので。
Azif - No.612
 Psychsさん。返信有難うございます。
 アドバイスの通り、ユーザ欄を変更し、また.cに変えてコンパイルしたのですが、反応してくれません。
 
 DLLについて調べていると、DLLmainと言う部分があるようなのですが、マクロに使用するDLLにもこの部分は必要なのでしょうか?
 ヘルプにはDLLmainで始まる記述が見つかりませんので、これまで書いていませんでした。
Psychs - No.613
手元で bcc で dll を作って DependencyWalker で確認してみたところ、
bcc では、dll のシンボルテーブル上の関数名の先頭に「_」がつくようです。

したがって、
Privmsg %c $DllFunc(mydll2.dll,_mozi,%m)
としてみてください。
Azif - No.614
 Psychsさん。返信ありがとうございます。
 お陰でマクロが正常に作動しました。
 これでマクロを自作できます。
 回答有難うございました。
Psychs - No.705
2.16 で「_」で始まるシンボルを自動的に認識するように
改善しました。
vita - No.719
◇はじめまして◇
最近、Limechatを導入し、マクロを作り始めました。
そのとき、この内容が目に留まったので、挑戦してみました。
CelenさんとAzifさんのソースを参考にさせて頂きました。
ほかの人の参考になればと思い、UPしておきます。

◇参考にしたサイト◇
===================================================================
猫でもわかるプログラミング ttp://www.kumei.ne.jp/c_lang/index.html
===================================================================

◇使用環境◇
===================================
コンパイラ:Borland C++Compiler 5.5
作成ソフト:BCC Developer v1.2.21
===================================

◆実行結果◆
========================
テスト
改行
されているか?
========================

◆マクロ項目◆
=======================================
ユーザ:%me
コマンド:test
動作:Raw
動作の情報:$DllFunc(mydll.dll,mozi,%m)
=======================================

◆ソースファイル◆
====================================================================================
/* mydll.dll */

#include <windows.h>

extern "C" __declspec(dllexport)
void __cdecl mozi(const char* Input, char* Output);

extern "C" __declspec(dllexport)
void __cdecl mozi(const char* Input, char* Output)
{
lstrcpy(Output,"Privmsg %a テスト\r\nPrivmsg %a 改行\r\nPrivmsg %a されているか?");
}
====================================================================================
※注)【\r\n】の【\】は【バックスラッシュ】です。
ふぇい - No.2311
マクロで複数行出力したいと思って ここへ辿り着きました

最終的な目標ははいくつかの発言を読み込んでファイル出力した情報を
あるキーワードで出力できるようになればと思っているのですが、DLL作成とかやったことないので少し挫けかけています。

Vitaさんの参考用ソースファイルをコンパイルしてみようと思い
VisualC++ 2010 Express 落として試行錯誤してるんだけど
参考用のソースをコンパイルしようとしたら

error C2664: 'lstrcpyW' : 1 番目の引数を 'char *' から 'LPWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

となってしまいうまくコンパイルできません。
どこをどう治せばいいのか よければご教示願います。
ふぇい - No.2312
ひとまず以下の変更で無事コンパイルできました お騒がせしました

プロジェクト>プロパティ>全般>文字セット
Unicode 文字セットを使用する→マルチ バイト文字セットを使用する

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

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

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