mfc-ml

1999年04月

30

[mfc 15739] Re: コントロールIDについて

>まさしです。
>
>In [mfc 15711] Re: コントロール IDについて 
>はっちゃん  <w...@ml.acty-net.ne.jp> Wrote:
>
>私>Cxxx::DoDataExchange(CDataExchange* pDX)
>私>{
>私>    DDX_Control(pDX, IDC_EDIT1, m_Edit[0]);
>私>    DDX_Control(pDX, IDC_EDIT2, m_Edit[1]);
>私>
>私>とかのほうがいいかと。
>
>> 
>> CDialog::DoDataExchange(pDX);
>> //{{AFX_DATA_MAP(CIpmini02Dlg)
>> DDX_Control(pDX, IDC_ST_TXT1, hdlStT[0]);
>> //}}AFX_DATA_MAP
>> 
>> こうすると parsing errorというのが起きて、
>> ) が必要ですとなります。
>
>何故、そして何のエラーなのかはわかりませんが、参考までに実際にテストして
>みたものを次に記載します。
>
>class CDlg1 : public CDialog
>{
>// コンストラクション
>public:
>    CDlg1(CWnd* pParent = NULL);   // 標準のコンストラクタ
>
>// ダイアログ データ
>    //{{AFX_DATA(CDlg1)
>    enum { IDD = IDD_DIALOG1 };
>    //}}AFX_DATA
>    CEdit    m_Edit[2];
>// オーバーライド
>    ... 以下略 ...
>---
>
>void CDlg1::DoDataExchange(CDataExchange* pDX)
>{
>    CDialog::DoDataExchange(pDX);
>    //{{AFX_DATA_MAP(CDlg1)
>    //}}AFX_DATA_MAP
>    DDX_Control(pDX, IDC_EDIT1, m_Edit[0]);
>    DDX_Control(pDX, IDC_EDIT1, m_Edit[1]);
>}
>
>蛇足ですが、現在、VC の Class Wizard で認識できる形式ではないと思われるの
>で、コメント AFX_... の外に記述したほうが無難かと思います。
>
>> 大井さんの方法で
>> IDC_EDIT1=1501
>> というようなコードはどこに入れるのでしょうか?
>
>ついでなんで回答しますが、
>すでに IDC_* を作成済みであれば、resouce.h を直接編集するのが早いと思いま
>す。
>もしくは、VC でリソースを編集する時に、Edit Control 等、各々のプロパティ
>を見ると 「ID : [IDC_EDIT1    ] 」とかになっていると思いますが、ここで
>「ID : [IDC_EDIT1=1501  ] 」とすると、指定の ID 値を使用してくれます。
>結果の確認は、メニューより「表示(V)」->「シンボルブラウザ(Y)...」でどうぞ。
>
>ではでは。
>

ありがとうございます。
実験してみます。
30

[mfc 15738] Re: コントロール IDについて

まさしです。

In [mfc 15711] Re: コントロール IDについて 
はっちゃん  <w...@ml.acty-net.ne.jp> Wrote:

私>Cxxx::DoDataExchange(CDataExchange* pDX)
私>{
私>    DDX_Control(pDX, IDC_EDIT1, m_Edit[0]);
私>    DDX_Control(pDX, IDC_EDIT2, m_Edit[1]);
私>
私>とかのほうがいいかと。


> CDialog::DoDataExchange(pDX);
> //{{AFX_DATA_MAP(CIpmini02Dlg)
> DDX_Control(pDX, IDC_ST_TXT1, hdlStT[0]);
> //}}AFX_DATA_MAP

> こうすると parsing errorというのが起きて、
> ) が必要ですとなります。

何故、そして何のエラーなのかはわかりませんが、参考までに実際にテストして
みたものを次に記載します。

class CDlg1 : public CDialog
{
// コンストラクション
public:
    CDlg1(CWnd* pParent = NULL);   // 標準のコンストラクタ

// ダイアログ データ
    //{{AFX_DATA(CDlg1)
    enum { IDD = IDD_DIALOG1 };
    //}}AFX_DATA
    CEdit    m_Edit[2];
// オーバーライド
    ... 以下略 ...
---

void CDlg1::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CDlg1)
    //}}AFX_DATA_MAP
    DDX_Control(pDX, IDC_EDIT1, m_Edit[0]);
    DDX_Control(pDX, IDC_EDIT1, m_Edit[1]);
}

蛇足ですが、現在、VC の Class Wizard で認識できる形式ではないと思われるの
で、コメント AFX_... の外に記述したほうが無難かと思います。

> 大井さんの方法で
> IDC_EDIT1=1501
> というようなコードはどこに入れるのでしょうか?

ついでなんで回答しますが、
すでに IDC_* を作成済みであれば、resouce.h を直接編集するのが早いと思いま
す。
もしくは、VC でリソースを編集する時に、Edit Control 等、各々のプロパティ
を見ると 「ID : [IDC_EDIT1    ] 」とかになっていると思いますが、ここで
「ID : [IDC_EDIT1=1501  ] 」とすると、指定の ID 値を使用してくれます。
結果の確認は、メニューより「表示(V)」->「シンボルブラウザ(Y)...」でどうぞ。

ではでは。
30

[mfc 15737] Re: イベントディスパッチインターフェイスのクライアント側での処理方法

>イベント用の外部インターフェイスは、クライアント側でそれに対応する
>クラスを作り、そのポインタを IConnectionPoint::Advise を使って
>サーバーに引き渡します。
>
>と、書くのは簡単ですが、実際は大量のコードが必要です。
>今回は、サーバーは既存のもののようなので、少しは楽かもしれません。
>
>MFC つかってますか?MFC でのサンプルをアメリカの Microsoftのサポート
>技術情報で見つけましたので参考になるかもしれません。
>文書番号は Q181845 です。
>タイトル[HOWTO: Create a Sink Interface in MFC-Based COM Client]
>
>
>idlファイルからC++のクラス定義を作成するには以下の方法があります。
>
>1.MIDLコンパイラを使う
>2.#import ディレクティブをつかう
>3.ClassWizardの新規クラスの作成で、「タイプライブラリから」
>  ラッパクラスを作成する(MFCの場合のみ)
>
>
>クライアントが MFCではない場合・・・応援します・・
>がんばってください・・・
>
>H.Miura

 回答ありがとうございます。MSのサポート技術情報を見ました。
幸い私は、MFCを使っているのですぐに実装できそうです。実はサーバー、クライアント両方を作っているのですが、サーバー側のCConnectionPointの実装方法は、ヘルプに載っていたので分かったのですが、クライアント側の実装方法ヘルプがなくて困っていました。ありがとうございます。
 ただ、一つ質問があります。ClassWizardで作成された、イベント用のインターフェイスラッパクラスのメンバ関数の中でInvokeを呼んでいますが、これは消してもよろしいのですか?サーバー側から呼ばれるんだからいらないですよね?

DaisukeTanaka
30

[mfc 15736] Re: リンクのエラー

想像ですが、CとC++のリンゲージ指定の問題かもしれないですね。

DLLをC言語で作っていませんか?
もしくはエクスポートした関数に extern "C" をつけていませんか?

作成したDLLを dumpbin /export でみると、エクスポートした関数の装飾名
がわかるので確認してみてください。
(VC60 ならDependency Warker というツールでもOK、こっちのほうが便利)

その結果、もし "_xxxx@8" とかいう形式であるばあい、その関数は C 形式
の装飾名でエクスポートされています。

この C 形式でエクスポートされた関数を、C++で使う場合、それを使用する
側のソースにおける関数のプロトタイプ宣言に、 extern "C" をつける必要
があります。

違っていたらごめんなさい

H.Miura
30

[mfc 15735] Re: C++のDLLをWin95で呼び出せない

>VC++5.0で開発したDLLを、VBから呼び出そうとしたところ、
>WinNT4.0上では呼び出せたのですが、
>Win95上では「ファイルが見つかりません」(Err.Number=7)
>とエラーが発生します。
>当然DLLは存在しますし、VBでフルパス指定でDeclareしても
>同じ結果でした。
>
>なお、DLL関数は次のように定義しています。(defファイルもリンクしています)
>CARINFO WINAPI GetCarInfo(LPSTR szImgFileName, LPSTR szPath)
>


DLLでほかに依存しているモジュールはないですか?
たとえば MFC42.DLLやMSVCRT.DLLなど。
それと、ないと思うけど、Debug版を持っていってないですか?

フルパス指定で駄目となるとそれぐらいかな・・・

H.Miura
記事検索
Amazon.co.jp
  • ライブドアブログ