解決


LOVE200  2005-09-05 23:39:31  No: 124890

DDEについて簡単な質問をさせてくださいませ。
VB.NETでDDE通信をしようとしてます。
検索もしっかりして(つもりですが)どうしても.NETの参考が出てきません。
基本的にC言語が主みたいですこの通信は。それでDdeInitializeのAPPCMD_CLIENTONLY
の引数なのですが、C言語などはこのAPPCMD_CLIENTONLYとそのまま打ってもエラーはでませんが、.NETでこれを普通に打ってしまうとエラーがでてしまいます。↓にあるように""と囲んで打つとエラーがなくなります。実際に
.NETをもっているかたは試してもらえると嬉しいです。
 DdeInitialize(m_ddeinst, dde_callback, "APPCMD_CLIENTONLY", 0)
果たしてこの対処法で正常に動くのでしょうか?正しいのでしょうか?
もし動かなかった場合の他の対処の仕方をご存知でしたら、優しく教えてくださいませ。


魔界の仮面弁士  2005-09-05 23:53:31  No: 124891

文字列にしてはマズイでしょう。APPCMD_CLIENTONLY は整数値ですから。
今回使用するという APPCMD_CLIENTONLY の場合は、
    Const APPCMD_CLIENTONLY As Int32 = &H10I
という値で宣言しておいてください。

DdeInitialize は、.NETで用意された命令ではなく、OS自身が持つ
Win32 APIですよね。つまり、.NET側ではサポートされていない物なので、
P/Invoke での呼び出しに必要な関数や定数を、すべて自分自身で
定義しなければなりません。
(もしくは、誰かがそれを .NET用のDLLとして作成した物を流用するか)

こうした API の定数値について調べるには、Platform SDK に含まれる
C言語用のインクルードファイルを調べ、それを VB語に翻訳して使います。
(今回の定数値は、DDEML.H というファイルにて定義されていますね)


id_rsa+  2005-09-05 23:53:56  No: 124892

APPCMD_CLIENTONLYは定数ですので、
const APPCMD_CLIENTONLY As Integer = &h10
で宣言しましょう。


LOVE200  2005-09-06 01:04:06  No: 124893

魔界の仮面弁士さん
id_rsa+さん
<<
とりあえず、プログラムを実行した訳ではありませんが感謝します♪
ありがとうございます。
ところで魔界の仮面弁士さん

Const APPCMD_CLIENTONLY As Int32 = &H10Iと
id_rsa+の
const APPCMD_CLIENTONLY As Integer = &h10は
どちらが正しいのでしょうか????

今しばらく、DDE通信のプログラム作成は時間がかかりそうなので
また分からないことがあったら名指しで質問してもよろしいですか?_
連絡方法がこれといってないので、また、?の文字が出てきたら私が
DDE通信について質問してきたと思ってください。
不定期になってしまいますが、その際はまたよろしくお願いします!


id_rsa+  2005-09-06 01:19:39  No: 124894

VB.NET的には魔界の仮面弁士さんの
Const APPCMD_CLIENTONLY As Int32 = &H10I
が正しいです。。
あと、「?」はやめて下さい。他の方が情報を見つけづらくなります。


LOVE200  2005-09-06 01:25:03  No: 124895

id_rsa+さんの
const APPCMD_CLIENTONLY As Integer = &h10
は何的なのでしょうか?
あと、「?」はやめて下さい。他の方が情報を見つけづらくなります。
<<
それでは[?DDE通信.NET]
と表記させていただきます。


id_rsa+  2005-09-06 01:38:43  No: 124896

VB6的とでも申しましょうか・・・・
でも、IntegerとInt32は同じです。
分り易さの点でInt32を使う方が親切な気がします。


魔界の仮面弁士  2005-09-06 03:23:09  No: 124897

引用箇所は「<<」を使って表現するのではなく、文頭に「>」を含める形に
していただけると、(この掲示板の場合は)引用箇所がわかりやすいです。

> どちらが正しいのでしょうか????
VB.NETのヘルプで、「プリミティブ型」の解説を見ていただくと
わかりますが、VB.NETでは、Integer というデータ型は、
System.Int32 構造体の『別名』に過ぎません。

私が、Integerではなく、Int32を使ったのは、それが「32bit整数型」で
ある事がわかりやすいから、というだけであって、実際の動作としては
どちらを使っていただいても、問題ありませんよ。

たとえば、
  Const APPCMD_CLIENTONLY As Int32        = 16%
  Const APPCMD_CLIENTONLY As Integer      = &H10
  Const APPCMD_CLIENTONLY As System.Int32 = &H10I
は、いずれも全く同じ内容を意味しています。

----- 以下補足 -----

厳密にいうと、どちらも正しい宣言とは言えなかったりもします。

APPCMD_CLIENTONLY は本来、C/C++でいう所の DWORDという型なのですが、
これは『32-bit unsigned integer(32ビット符号無し整数型)』という型です。
一方、VB.NETのInteger型は、「32ビット符号付き整数型」と呼ばれる物であり、
厳密に言えば異なるデータ型といえます。

本来であれば、「32-bit unsigned integer」型の宣言である、
「As System.UInt32」を使いたいところなのですが、現在のVB.NETでは
UInt32型の「定数」を宣言する事ができません。(Visual Basic 2005であれば可能)

とはいえ、API側から見た場合は、型が UInt32 であれ Int32 であれ、
渡されるデータ自体は同じものであり、結果には影響しませんので、
便宜上、現在の VB.NET では、Integer型(System.Int32型)で宣言するのが
一般的となっています。


LOVE200  2005-09-06 03:25:14  No: 124898

定数値がしりたくて先ほどから調べていますが、いまいち調べれません。
魔界の仮面弁士さんが言うとおり
Platform SDKをダウンロードしてきてその中から
C言語のインクルードファイルを調べればよいのですよね?
しかし、これが英語であるしそれと同時にインクルードファイルの場所が
分かりません。
&H10Iの
10Iというのは多分ですがリテラル値なんですよね?
そのうえの&Hは何を表しているのでしょう?
ぶっちゃげ
↓の定数値も教えていただけたらありがたいのですが、
XTYP_REQUEST
CP_WINANSI
CF_TEXT


LOVE200  2005-09-06 03:37:45  No: 124899

魔界の仮面弁士さん
>
毎度、貴重な回答ありがとうございます。
上の質問なんですが、関数の宣言が全部integer
型なのですべて&H10Iでよろしいのですか?


あん  2005-09-06 04:09:05  No: 124900

>定数値がしりたくて先ほどから調べていますが、いまいち調べれません。
VB6.0をお持ちなら「APIビューア」という
ツールがあります。
ないなら「MSDN」で検索ですね。


魔界の仮面弁士  2005-09-06 04:20:51  No: 124901

> Platform SDKをダウンロードしてきてその中から
あれ? 最初の投稿に、
>>C言語などはこのAPPCMD_CLIENTONLYとそのまま打っても
と書かれていたので、既にインクルードファイル/ヘッダファイルも
既に入手済みだと思ってました……。

とりあえず、質問に挙がった XTYP_REQUEST, CP_WINANSI, CF_TEXT などは、
ヘッダファイルを調べるのが面倒なのであれば、C言語にて、それらの値を
表示させるようなテストプログラムを作った方が手っ取り早いかも。

> しかし、これが英語であるし
う〜ん。英語の説明を掲示板で、逐一翻訳するわけにも行きませんので、
大変でしょうけど、辞書や翻訳サイトを使って頑張って読んでください。(^^;

文学的な表現が使われているわけではありませんので、中2程度の
英語力があれば、大意程度は読み通せると思いますよ。

> それと同時にインクルードファイルの場所が分かりません。
*.h ファイルは、include とうフォルダの下に作られる事が
多いと思います。インストール後、エクスプローラの
『検索』機能で探してみてください。

> &H10Iの10Iというのは多分ですがリテラル値なんですよね?
そうです。先の定数の場合、ヘッダファイル上では
 #define     APPCMD_CLIENTONLY            0x00000010L
と定義されていますので、それを VB に翻訳したものです。
0xは、16進数表記の意味なので、VBでは &H に置き換えて、
 Const APPCMD_CLIENTONLY As Int32 = &H00000010I
という事ですね。

> ぶっちゃげ
「ぶっちゃけ」、ですよね。
http://d.hatena.ne.jp/keyword/%A4%D6%A4%C3%A4%C1%A4%E3%A4%B2

> XTYP_REQUEST
> CP_WINANSI
> CF_TEXT
では、ヘッダファイルそのままの引用で書きますね。
VBへの置き換えはご自身で行ってみてください。

> XTYP_REQUEST
#define     XCLASS_DATA              0x2000
#define     XTYP_REQUEST            (0x00B0 | XCLASS_DATA          )

> CP_WINANSI
#define CP_WINANSI      1004    /* default codepage for windows & old DDE convs. */

> CF_TEXT
#define CF_TEXT             1


LOVE200  2005-09-06 04:56:21  No: 124902

>魔界の仮面弁士さん
自慢じゃないですが、私はこう見えても初心者ですよ。
はっきりいっていっている意味がまったく分かりません。
VBに置き換えろといわれても理論もわかっていなのに
置き返れるわけないですし、他の定数は
APPCMD_CLIENTONLYの奴とは目の錯覚でしょうかまったく違うように
見受けられます。
ぶっちゃげはぶっちゃけのなまり(関西弁)だととらえて
もらえれば分かりやすいと思います。
お手数ですが、ぶっちゃけ
XTYP_REQUEST
CP_WINANSI
CF_TEXT
の値はなんになるのですか?
教えてください!!!


Geo=TK3  2005-09-06 05:20:11  No: 124903

XTYP_REQUEST = &h20B0
CP_WINANSI   = 1004
CF_TEXT      = 1

定数値は上記の通り。
これを Visual Basic で使えるように定義するのは自分でやってね。
Const 使えば出来るから。


LOVE2000  2005-09-06 05:58:22  No: 124904

>Geo=TK3さん
ぶっちゃげてくれてどうもありがとうございます。
なんでそういったことになるのか論理ではさっぱり分かりませんが、
とりあえず試してみます、ありがとうございまた!


魔界の仮面弁士  2005-09-06 07:44:00  No: 124905

> はっきりいっていっている意味がまったく分かりません。
わからない点については、どの部分がわかりにくかったのかを
具体的に教えていただけると、回答側としては助かります。m(_ _)m

でも、「まったく分からない」というのは大袈裟でしょう……。(^^;
そんなに悲観的にならなくても大丈夫だと思いますよ。
# 実際、IntegerとInt32が同じ意味であるという説明は理解されたようですし

> なんでそういったことになるのか論理ではさっぱり分かりませんが、

そこで是非、先の回答を、もう一度思い出してみてください。
>>  #define     APPCMD_CLIENTONLY            0x00000010L
>> と定義されていますので、それを VB に翻訳したものです。
>> 0xは、16進数表記の意味なので、VBでは &H に置き換えて、
>>  Const APPCMD_CLIENTONLY As Int32 = &H00000010I
と書かれた投稿があるかと思います。

そこで、上記を今回の CF_TEXT に応用すれば、
>  #define CF_TEXT             1

 Const CF_TEXT As Int32 = 1I
である事が、ある程度推測できるのではないでしょうか。

同様に、CP_WINANSI については、
> #define CP_WINANSI      1004    /* default codepage for windows & old DDE convs. */
後半の「/* 〜 */」部分がC言語のコメント部なので、
 Const CP_WINANSI As Int32 = 1004I  'default codepage for windows & old DDE convs.
となるわけです。

> APPCMD_CLIENTONLYの奴とは目の錯覚でしょうかまったく違うように
> 見受けられます。
それはおそらく、XTYP_REQUEST の事ですよね。

これはちょっと複雑に見えるかも知れませんが、具体的には
>> #define     XCLASS_DATA              0x2000
>> #define     XTYP_REQUEST            (0x00B0 | XCLASS_DATA          )
が、
 Const XCLASS_DATA  As Int32 = &H2000I
 Const XTYP_REQUEST As Int32 = &H00B0I Or XCLASS_DATA
のように置き換わります。C言語での「|」が、VBでの「Or」に相当します。

あるいは、これらを最初から演算しておいて、
 Const XTYP_REQUEST As Int32 = &H20B0I
と書いたり、あるいは 10進数表記で
 Const XTYP_REQUEST As Int32 = 8368
のように書いても、同じ結果が得られます。


魔界の仮面弁士  2005-09-06 08:14:49  No: 124906

ついでにもう一つ。

上記宣言で使った、「As Int32」というデータ型の部分ですが、
今回のケースでは、残念ながら #include の部分を見ただけでは、
どのように定義すべきか、類推しきれないと思います。

こういう時は、それらが「どこで利用される定数なのか」を、
別途調べる必要があったりします。

たとえば、『CP_WINANSI』について、google や MSDN などで
検索してみてください。

そうすると、この定数が DdeCreateStringHandle APIの第3引数や、
CONVCONTEXT 構造体の iCodePage メンバで使われているサンプルを
見つける事ができるかと思います。(残念ながら、Cのサンプルばかりですが)

で、さらに DdeCreateStringHandle 関数等の定義を追加調査すると、
それらが「(C言語の)int型」として定義されている事が見えてきます。
(ゆえに、CP_WINANSI も int型であるという事になります)

Cのintは「32bit符号付き整数型」なので、結果として、
『System.Int32型(Integer型)』が適切、という事がわかり、最終的に
  Const CP_WINANSI As Int32 = 1004I
のような宣言となる……というわけです。

同様に調べると、CF_TEXT は UINT型として使われている事がわかります。
(ちなみに、XTYP_REQUEST もまた、UINT型として使われます)
そして UINT とは、「32bitの符号無し整数型」を意味します。
http://web.archive.org/web/20041015041805/http://www.gj.il24.net/~nakasima/prog/datatype.htm

この場合の置き換えは、先の回答を思い出してください。
「32bitの符号無し整数型」なので、System.UInt32 を使いたい所ですが、
実際には先に回答したように、
>> 現在のVB.NETではUInt32型の「定数」を宣言する事ができません。
という事なので、UInt32を使うことはできません。

そのかわりに、
>> 便宜上、現在の VB.NET では、Integer型(System.Int32型)で宣言するのが
>> 一般的となっています。
と代替処置を行うというわけですね。


LOVE20000  2005-09-06 09:21:57  No: 124907

>魔界の仮面弁士さん
親切な回答真に御礼申し上げます。
冷たい回答者が真に多い昨今。
魔界の仮面弁士さんだけは
とても親切に教えてくださり、
失礼ながらそこまで親切にする理由もよく分かりません。
他の方々にも親切に教えているようで・・・
コンピュータの知識及び
その親切心はいったい魔界の仮面弁士さんは
何者なのでしょうか?私の知る余地ではございませんが
とりあえず、今の段階では一気に覚えることは残念ながらできませんが
これから先の参考に十分なりうると思いますでファイルにでも
した所存です。
魔界の仮面弁士さんが親切すぎるところから
どこまで甘えていいのか分からない今日この頃ですが、
また何かあったら宜しくお願いしたいところです。
ありがとうございました!


LOVE20000  2005-09-06 09:31:33  No: 124908

>Const XCLASS_DATA  As Int32 = &H2000I
>Const XTYP_REQUEST As Int32 = &H00B0I Or XCLASS_DATA
>のように置き換わります。C言語での「|」が、VBでの「Or」に相当します。

>あるいは、これらを最初から演算しておいて、
> Const XTYP_REQUEST As Int32 = &H20B0I

欲をいえばこのあたりの演算の仕方がわかりませんよね。
orって書いているのに&H2000Iと&H00B0Iを足したというか重ねたとういか
値に見えるし・・・


id_rsa+  2005-09-06 09:37:42  No: 124909

ビット演算です。
教えてもらうのも良いと思いますが、自分で苦労して調べた方が身になりますよ。
Googleなどで検索すれば、いろいろ情報は得られますので・・・
別に意地悪じゃなくてね。。


Blue  2005-09-06 09:38:26  No: 124910

> orって書いているのに&H2000Iと&H00B0Iを足したというか重ねたとういか
> 値に見えるし・・・
これは論理和とよばれるものです。

論理和 論理積 でグーグル検索してみてください。

とりあえず先頭にきたページのリンクはっときます。
http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text/ronri.htm


名無し  2005-09-06 11:00:47  No: 124911

名前を変えても誰だかわかる頭の悪さがなんとも(ry


LOVE20000  2005-09-06 11:18:33  No: 124912

>>頭の悪さがなんとも(ry
頭がわるい(プ
おめーの数億倍あたははええよ。
誰だか分かったらいけない理由でもあんのか?w
おれは気分で変えているだけだ
名無しはわざわざ名前変えてるってことは
誰だかしられちゃまずいのか?
オタクがばれたらまずいのか?w
誰だかわかる頭の悪いのはお前の方(プ


初心者  2005-09-06 17:39:17  No: 124913

> 誰だか分かったらいけない理由でもあんのか?w
> おれは気分で変えているだけだ
自慢じゃないですが、私はこう見えても初心者ですよ。
はっきりいっていっている意味がまったく分かりません。


特攻隊長まるるう  2005-09-06 18:03:21  No: 124914

>おれは気分で変えているだけだ
同じ分野のプログラムでの質問を繰り返し質問する時とかは
ハンドルは統一しておく方が得です。質問者の開発環境の情報を
回答者がより多く把握できるのでより参考になる回答が付けられる
可能性が高くなります。

…あと、…それなりに説明を繰り返すと地が出てくるものなので、
言葉の選択とかクセで同じ人の書込みであろう予想は大体つくけど、
ハンドルは意図的に変えているわけだから、別人として扱ってあげた
方が良いのかどうかに迷います。気分だけの問題でしたら共通の
ハンドル名を使うようにして下さい。


ななし  2005-09-06 19:49:49  No: 124915

最近とみにここの掲示板でも目立ちますよね、こういう困った人。

http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200509/05090018.txt

↑の「悲しい騎士」も「LOVE」の別人格かな?
まぁ他にも似たような人はいますが。
いずれにせよ、こういう人達には、常識を逸脱したレス、対応が出始めた時点で一切の有効な回答は与えないってことにした方がいいですよね。

#レス数の異様に伸びてる話題はたいていコレ系だったりする。。。


名無し  2005-09-06 20:13:37  No: 124916

>「悲しい騎士」も「LOVE」の別人格かな?
まったく同じ。
あのHNじゃもう答えてもらえないだろうから隠そうとしたけど隠せなかった、というオチ。


マグ  2005-09-06 22:01:04  No: 124917

実際に回答していない方も何人かいるみたいですし・・・・・・
ななしさんの言うとおりレス数も異常に伸びているし・・・・・
40レスを超えた板って初めて見ましたし・・・・・・・・・・・
あと、質問者の態度も・・・・・・・・・・・・・・・・・・・


ひでらん  2005-09-07 01:08:43  No: 124918

無駄にレス数を伸ばす必要は無いと思ったのですが、
一応関連?という事で勘弁してください。

1. VB6の場合はAPIビュアーがあるので、この手の定数は
   すぐ確認出来ますが、VB.NETにはないのでしょうか?

2. APIビュアーがない場合、VB.NETを使用している人は
   どの様に定数を調べているのでしょうか?

※VBを使用するのにCのヘッダーを見ると言うのもなんか
  釈然としません。個人的にはVCで作ればいいので問題
  ないのですが、後学のために教えてください。


いな  2005-09-07 01:19:57  No: 124919

> 1. VB6の場合はAPIビュアーがあるので、この手の定数は
>    すぐ確認出来ますが、VB.NETにはないのでしょうか?

私は、

http://dobon.net/vb/dotnet/links/apiviewer.html
を使用しています。


マグ  2005-09-07 01:50:31  No: 124920

>1. VB6の場合はAPIビュアーがあるので、この手の定数は
>   すぐ確認出来ますが、VB.NETにはないのでしょうか?

私は検索で調べます。
C言語、C#、VB6、VB.NET、念入りにHSPを対象に・・・・・・・
見つかったら、VB.NETのソースに自分で変えています。


ひでらん  2005-09-07 01:51:03  No: 124921

いなさん、ありがとうございます。

やっぱり標準では無いんですね。
なぜ削除なんかするんだろう・・・。

VB.NETには移行せずVB2005に移行するつもりですが
VB2005も一緒だろうなぁ・・・。


いな  2005-09-07 02:23:45  No: 124922

基本は、検索だと思う。
上記URLも、APIビューア VB.NETでググれば見つかるので、
探そうとさえ思えばそれほど苦労しないかと。

> VB.NETには移行せずVB2005に移行するつもりですが
> VB2005も一緒だろうなぁ・・・。

うん、一緒だと思うなぁ〜


魔界の仮面弁士  2005-09-07 02:45:36  No: 124923

> 一応関連?という事で勘弁してください。
次回からは、他人の質問に便乗はしないで頂けると……。
「解決済み」のスレッドで質問されると、投稿が埋もれてしまいますので。

関連があるのであれば、新規質問をした上で、過去ログのURLを
一緒に書くようにした方が良いと思います。

> 1. VB6の場合はAPIビュアーがあるので、この手の定数は
>    すぐ確認出来ますが、VB.NETにはないのでしょうか?
http://dobon.net/vb/dotnet/links/apiviewer.html

かな。あとはPINVOKE.NET等のサンプルを利用するとか。

> 2. APIビュアーがない場合、VB.NETを使用している人は
>    どの様に定数を調べているのでしょうか?
基本は検索でしょう。私は、原始的にヘッダをgrepしてます。(^^;
# そのヘッダすら、ごく稀に間違いがあったりしますが……。

そもそも、VB6の「API ビューア」や、VB5の「APIビューワ」は、
定数を調べるためのツールではありませんよね。

あくまでも、「入力を補助するツール」であって、ドキュメントでは
ありませんから、その値が正しいのか間違っているのかは、別途
調べるべきだと(私は)思っています。それを踏まえた上で、Win32API.TXT を
編集して「鍛えていく」ならば問題ないでしょうけれども。

> ※VBを使用するのにCのヘッダーを見ると言うのもなんか
>   釈然としません。
Win98などは、「WIN.TLB」ファイルが付属していて、VB5等から
参照設定するだけで、幾つかのAPIやCOMインターフェイスを、
宣言無しでも楽に呼び出せていましたよね。

それを突き詰めれば、WinFX(あるいはその進化系)になるのでしょうけれど、
現段階では、すべてのAPIをDLL化できているわけでは無いのですから、
元々がCからの呼び出しを前提として書かれている API を利用する場合に、
Cのヘッダー等を見なければならないとしても、それは仕方ない、と私は
割り切っています。(VB6でもそうでしたしね)


ひでらん  2005-09-07 17:55:01  No: 124924

マグさん、いなさん、魔界の仮面弁士さん
ありがとうございました、参考になりました。

>> 一応関連?という事で勘弁してください。
>次回からは、他人の質問に便乗はしないで頂けると……。
>「解決済み」のスレッドで質問されると、投稿が埋もれてしまいますので。
>
>関連があるのであれば、新規質問をした上で、過去ログのURLを
>一緒に書くようにした方が良いと思います。

なるほど、やはりそうですよね。
以後気をつけることにします。

ありがとうございました。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加