C#で作成したDLLNo.01135
signapi さん 13/11/24 17:29
 
いつもお世話になっております。
秀丸マクロで使用出来るDLLを自作又はアウトソーシングしようと考えています。

いろいろと検討してみた結果、C#での開発を考えています。
試しに下記リンクを参照して、C#で、DLLをコンパイルしてみたのですが、それぞれ
のメソッドをdllfuncで呼びだそうとしても上手く呼び出せません。

http://msdn.microsoft.com/ja-jp/library/3707x96z(v=vs.90).aspx

dllfuncのところは以下の様に記述しています。

#n = dllfunc ("AddClass.Add", 2, 3);

これは呼び出し方か、コンパイルの方法が間違えているのでしょうか、或いは他に原
因があるのでしょうか。

それとも、秀丸で動作するDLLは、c/c++で作成するしか無いのでしょうか。

何分勉強しながらの開発ですので初歩的な質問かと思いますがご教示いただければ幸
いです。




[ ]
RE:01135 C#で作成したDLLNo.01136
h-tom さん 13/11/24 19:14
 

h-tom です。

>いろいろと検討してみた結果、C#での開発を考えています。
>試しに下記リンクを参照して、C#で、DLLをコンパイルしてみたのですが、それぞれ
>のメソッドをdllfuncで呼びだそうとしても上手く呼び出せません。
dllfuncで呼び出す形式のDLLを、C#では作れないと思いますよ。
(普通に作ると、.NETのクラスを公開しているだけ。)

COM I/F のDLL(createobjectで使うタイプ)なら、作成可能だったはずです。
(作ったことはないですが。)

[ ]
RE:01135 C#で作成したDLLNo.01137
いいじま さん 13/11/24 19:18
 
いいじまです。

> いろいろと検討してみた結果、C#での開発を考えています。
> 試しに下記リンクを参照して、C#で、DLLをコンパイルしてみたのですが、
> それぞれのメソッドをdllfuncで呼びだそうとしても上手く呼び出せません。
>
> http://msdn.microsoft.com/ja-jp/library/3707x96z(v=vs.90).aspx
>
> dllfuncのところは以下の様に記述しています。
>
> #n = dllfunc ("AddClass.Add", 2, 3);

クラスのメソッドをそのままの名前で呼び出すことは無理と考えてください。

まず、現在の32bit版Windowsの開発には、「Win32」という方式と、
「.NET」という方式があります。

前者はWindows3.1の16bitアプリからの流れをくむもので、Excelの
マクロなどからWindowsの機能を呼び出す場合もこの方式になります。

一方で後者は、近年になってWindows XP以降用に開発されたもので、
C#はこちらの流儀のアプリしか書けません。.NETのアプリから
Win32のDLLを呼び出す場合にはそのものずばりWin32というクラスが
ありますが、逆はどうも見当たらないようです。
(秀丸はWin32アプリです。)

個人的には、C# がベストである理由が見当たりません。
C++を使えばstring、vector、classといった機能は一通り使えますし、
Windows以外にも使いまわしがききます。
同じモジュールを使うプログラムを C# なり VB.NET なりで書くので
あっても、C/C++で書いたDLLを呼び出すことはできるはずです。

あとは、extern "C"、__cdecl、__pascal という3つのキーワード
について調べておいてください。

[ ]
RE:01136 C#で作成したDLLNo.01138
signapi さん 13/11/24 22:04
 
>
>h-tom です。
>

>dllfuncで呼び出す形式のDLLを、C#では作れないと思いますよ。
>(普通に作ると、.NETのクラスを公開しているだけ。)
>
>COM I/F のDLL(createobjectで使うタイプ)なら、作成可能だったはずです。
>(作ったことはないですが。)

アドバイスありがとうございます。

そうなんですね。質問を投稿後、dllfuncじゃなくてCOM I/Fだったら可能かなとは考
えてみたんですがやり方がわかりません。
もうちょっと調べてみて、無理そうなら別の言語での開発を試みてみます。

[ ]
RE:01137 C#で作成したDLLNo.01139
signapi さん 13/11/24 22:11
 
>いいじまです。

>クラスのメソッドをそのままの名前で呼び出すことは無理と考えてください。
>
>まず、現在の32bit版Windowsの開発には、「Win32」という方式と、
>「.NET」という方式があります。
>
>前者はWindows3.1の16bitアプリからの流れをくむもので、Excelの
>マクロなどからWindowsの機能を呼び出す場合もこの方式になります。
>
>一方で後者は、近年になってWindows XP以降用に開発されたもので、
>C#はこちらの流儀のアプリしか書けません。.NETのアプリから
>Win32のDLLを呼び出す場合にはそのものずばりWin32というクラスが
>ありますが、逆はどうも見当たらないようです。
>(秀丸はWin32アプリです。)

アドバイスありがとうございます。そういう違いがあるんですね。勉強になりました。


>個人的には、C# がベストである理由が見当たりません。
>C++を使えばstring、vector、classといった機能は一通り使えますし、
>Windows以外にも使いまわしがききます。
>同じモジュールを使うプログラムを C# なり VB.NET なりで書くので
>あっても、C/C++で書いたDLLを呼び出すことはできるはずです。
>
>あとは、extern "C"、__cdecl、__pascal という3つのキーワード
>について調べておいてください。

丁寧にありがとうございます。C++での開発を考えてみます。あとキーワードに付い
ても調べてみます。方向性が見えてきただけでも非常に助かりました。

[ ]
RE:01138 C#で作成したDLLNo.01140
アルビレオ さん 13/11/24 23:00
 
横から失礼します。

>そうなんですね。質問を投稿後、dllfuncじゃなくてCOM I/Fだったら可能かなとは考
>えてみたんですがやり方がわかりません。
>もうちょっと調べてみて、無理そうなら別の言語での開発を試みてみます。

COM I/Fは基本的にアンマネージコード(たいていCかC++)で実装します。
マネージコード(実質.NETで動作するコードのこと)からCOMやアンマネージモジ
ュールを呼び出す方法はある程度用意されていますが、秀丸エディタなどのアン
マネージコードからマネージコードのモジュールを呼ぶ方法は、絶対にないとは
いえないけど需要が少ないせいか見たことがないように思います。

それに秀丸エディタ側のDLL呼び出しIFを変えるわけにもいかないため、マネー
ジコードDLLの方でアンマネージのふりをする必要がある、おそらくC++でラッ
パーDLLを別に用意するといった形になりそうで、それなら最初からC++でDLLを
作った方が楽だと思われます。

[ ]
RE:01135 C#で作成したDLLNo.01141
秀丸担当 さん 13/11/25 12:11
 

秀丸エディタから呼び出せる外部のDLLとしては、みなさんの言われている通り、
dllfunc等(一般的にc/c++で作る)を使う方法と、COMを使う方法があります。

他には、変換モジュールを自作する方法もありますが、これはdllfunc等と同じ
くc/c++で作ることになると思います。
それ以外には、DLLではないですがrun文やrunex文で外部のEXEを呼ぶ方法もあり、
コマンドラインや標準入出力を使って情報のやりとりも可能です。

私自身は.netについては詳しくないですが、C#とC++は名前は似ていますが全く
別のものと考えたほうがいいようです。
今までC#を使われていたとして、C++に変えるということだとたら基礎から学び
直さないといけないので大変だと思います。
C#はCOMとしても使えるようなので、DLLの呼ばれ方をCOMにも対応すると簡単だ
と思います。


Google検索してみたところ、以下の様なページが見つかり、こういう手順でやっ
てみたところ、秀丸エディタからも呼び出すことができました。
http://azurite.espel.jp/index.php/2011/03/16/vs2010-com/

COMとして作成する場合は、まずはvbsやjsから呼び出してみるといいと思います。
上記ページではvbsで以下のように書かれていました。

Set obj = CreateObject("MyClassLibrary.Calc")
obj.Msg("HelloCOM")

これを秀丸マクロに書き換えるとしたら以下のようになります。

#obj = createobject("MyClassLibrary.Calc");
callmethod #obj, "Msg", "HelloCOM";

[ ]
RE:01141 C#で作成したDLLNo.01142
signapi さん 13/11/25 18:08
 
秀丸担当者様

ご回答ありがとうございます。

>DLLではないですがrun文やrunex文で外部のEXEを呼ぶ方法もあり、
>コマンドラインや標準入出力を使って情報のやりとりも可能です。

↑そういうやり方もありましたか。調べてみます。


>私自身は.netについては詳しくないですが、C#とC++は名前は似ていますが全く
>別のものと考えたほうがいいようです。
>今までC#を使われていたとして、C++に変えるということだとたら基礎から学び
>直さないといけないので大変だと思います。

Cは以前勉強したことがあり、いくつかプログラムを作ったことがありますが、C++は
殆ど触ったことも無いです。この際しっかりと勉強し直そうと思っています。


>C#はCOMとしても使えるようなので、DLLの呼ばれ方をCOMにも対応すると簡単だ
>と思います。
>
>
>Google検索してみたところ、以下の様なページが見つかり、こういう手順でやっ
>てみたところ、秀丸エディタからも呼び出すことができました。
>http://azurite.espel.jp/index.php/2011/03/16/vs2010-com/
>
>COMとして作成する場合は、まずはvbsやjsから呼び出してみるといいと思います。
>上記ページではvbsで以下のように書かれていました。
>
>Set obj = CreateObject("MyClassLibrary.Calc")
>obj.Msg("HelloCOM")
>
>これを秀丸マクロに書き換えるとしたら以下のようになります。
>
>#obj = createobject("MyClassLibrary.Calc");
>callmethod #obj, "Msg", "HelloCOM";


↑大変助かります。非常に貴重な情報をありがとうございました。

[ ]