ActiveXコントロールについて

[戻る]
はな 2002/06/06(木) 14:57:32
CStaticクラスを継承したビットマップデータ表示用のActiveX
コントロールをVC++で実装しているのですが、下記の問題があり
困っています。誰か分かる方がいらっしゃれば教えて頂けませんか?

1.VBで実装された画面との間で、コントロールのメソッ
  ドでバイナリのバイト配列の受け渡しを行うにはどの
  ようにすればよいのでしょうか?

  具体的には、ClassWizardのオートメーションタブで
  コントロールのメソッドを追加するとき、メソッドの
  パラメータの型として、文字列へのポインタや、
  short型、long型へのポインタは選択可能なのすが、
  char型やBYTE型へのポインタがなく、どの型を選択す
  ればよいのかよくわからない状況です。よろしくお願
  いします。

2.コントロールがマウスでクリックされたとき、クリック
  されたポイントがコントロールのクライアント領域の中心
  に来るようにスクロールすることを考えております。

  具体的には、ClassWizardのメッセージマップタブで、
  WM_LBUTTONDOWNに対応したLButtonDown()を追加して、
  LButtonDown()の中でスクロール処理を行うように実
  装しております。

  ActiveXコントロールテストコンテナで動作確認をす
  る場合には、コントロールをクリックしたときには
  LButtonDown()が呼ばれて期待通りに動作していると
  思うのですが、コントロールをVBのフォームに挿入
  した状態では、コントロールをクリックしても
  LButtonDown()が呼ばれません。

  ここで質問ですが、コントロールをActiveXコント
  ロールテストコンテナに挿入した状態と、VBの
  フォームに挿入した状態では、何が違うのでしょう
  か?

テン 2002/06/06(木) 22:36:29
情報提供です。

>...バイナリのバイト配列の受け渡しを行うにはどの
>ようにすればよいのでしょうか?

翔泳社 ATL COM プログラミング
初版では p217 に
...
...別のプロセスにバイナリーデータを渡す場合は、
VT_UT1というタイプのSAFEARRAYで渡すことになります。
...
と記載されています。

はな 2002/06/07(金) 12:53:49
アドバイスありがとうございます。
さっそく調べて試してみます。

はな 2002/06/11(火) 19:40:47
2の質問に関してですが、解決しました。
MFC ActiveX ControlWizard を使用しStaticのActiveXを作成していたのですが、
noneで作成すればLButtonDownイベントが取得できるようになりました。
何故、Staticで作成した場合に、イベントが取得できないのかは分かりません。

テン 2002/06/12(水) 01:27:44
//本をかたてにコードを作ってみました。
//ただし本ではlong型の配列をBYTE型にかえたので不具合があるかも?
//ご参考までに。
//
/////////////////////////////////////////////////////////////////////////////
// CSACtrl メッセージ ハンドラ

SCODE CSACtrl::SABYTE(const VARIANT FAR& VR) 
{
// TODO: ここにディスパッチ ハンドラ コードを追加してください。
if (!(VR.vt & VT_UI1))    //BYTE型
  return DISP_E_TYPEMISMATCH;
if (!(VR.vt & VT_ARRAY))
  return DISP_E_TYPEMISMATCH;

SAFEARRAY* psa;
if (!(VR.vt & VT_BYREF))    //参照型
  psa = *(VR.pparray);
else
  psa = VR.parray;
long    lLBound;    //最下位委配列インデックス
long    lUBound;    //最上位委配列インデックス
SafeArrayGetLBound(psa, 1, &lLBound);
SafeArrayGetUBound(psa, 1, &lUBound);
//言語によって配列が 0 で始まったり 1 で始まったりする。
//ほかにもあるかも?

long    l, n;
BYTE*    pBW;
pBW = new BYTE[lUBound - lLBound + 1];
for (n = 0, l = lLBound ; l <= lUBound ; n++, l++)
{
  BYTE    b;
  SafeArrayGetElement(psa, &l, &b);    //配列から指定された要素をとりだす。
  pBW[n] = b;
}
delete[] pBW;
return    S_OK;

/*
//メソッドを呼び出しの例

SAFEARRAY    *psaAr = 0;
SAFEARRAYBOUND  saBo[1];
saBo[0].lLbound = 0;
saBo[0].cElements = 10;
psaAr = SafeArrayCreate(VT_UI1, 1, saBo);
BYTE BA[] = {1,2,3,4,5,6,7,8,9,0};
for (int i = 0 ; i < 10 ; i++)
{
  SafeArrayPutElement(psaAr, (long*)&BA[i], &i); //指定された要素に代入する。
}
VARIANT    VARI;
VariantInit(&VARI);
V_VT(&VARI) = VT_ARRAY | VT_UI1;
V_ARRAY(&VARI) = psaAr;

pSACtrl->SABYTE(VARI);    //メソッドを呼び出す。
*/
}

テン 2002/06/12(水) 09:34:17
if (!(VR.vt & VT_BYREF))    //参照型
は
if (VR.vt & VT_BYREF)    //参照型
の

BYTE BA[] = {1,2,3,4,5,6,7,8,9,0};
for (int i = 0 ; i < 10 ; i++)
は
BYTE BA[] = {1,2,3,4,5,6,7,8,9,0,0,0};
for (int i = 0 ; i <= 10 ; i++)

のまちがいです。すみません m(_ _)m

はな 2002/06/17(月) 14:51:22
[[解決]]
テンさんありがとうございます。
バイト型の配列をVBから渡すことができました!

古いスレッドには追加発言できません。