mcrblog

vcpp-ml

1999年08月

31

[vcpp 00032024] Re: ATL のBSTR型

teruk です。
お世話になっています。
Junji Fukuhara さん、こんにちは。

> 福原と申します。

>  ATL COMベースのアプリケーションの勉強を始めた
> ばかりなのですが、BSTR型ではまってます。


>  サーバーのインタフェースの実装を以下のように
> 記述しています。

> STDMETHODIMP Ctest1::get_getbstr(BSTR *pVal)
> {
>  // TODO: この位置にインプリメント用のコードを追加してください
>  *pVal = m_bstrTest;  // BSTR m_bstrTest;
>  return S_OK;
> }

>  クライアント側では以下のように実装しています。

>  CString strTest = "TEST Test test1";
>  p->put_getbstr((unsigned short*)"aaaaaaaaaaaaaaaa");
>  p->put_getbstr(strTest);
>  p->get_getbstr((unsigned short**)&strTest);

> 直接、文字列を渡すと結果は帰ってくるのですが、変数(strTest)を
> 渡すと正常結果が得られません。

CString <---> BSTR を変換する必要があります。

CString->BSTR
CString::AllocSysString 

BSTR->CString
AfxBSTR2CString

http://www.geocities.co.jp/SiliconValley/4809/mfc/mfc0600.html
31

[vcpp 00032023] Re:ATL のBSTR型

ども、しけぞーです。


> STDMETHODIMP Ctest1::get_getbstr(BSTR *pVal)
> {
>  *pVal = m_bstrTest;  // BSTR m_bstrTest;
Sys 系の API でコピーしないといけません。
# この場合 ::SysAllocStringLen(*pVal, ::SysStringLen(*pVal);
# かな?

>  クライアント側では以下のように実装しています。
>  CString strTest = "TEST Test test1";
>  p->put_getbstr((unsigned short*)"aaaaaaaaaaaaaaaa");
>  p->put_getbstr(strTest);
>  p->get_getbstr((unsigned short**)&strTest);
CString と BSTR は別物と考えた方が良いです。
この場合、
    CComBSTR bstTest = strTest;
としてから p->***_getbstr の引数に渡した方が良いと思います。

BSTR は CComBSTR のソースを見るとわかりやすいですよ。

---
Sikezoh   r...@nifty.ne.jp

---
池上 史郎  株式会社 ジェイ・ワン  システム開発部第1
品川区北品川1-10-4 YBビル3F
Tel:03(5463)1381   Fax:03(5463)1828
31

[vcpp 00032022] Re: [vcpp 00032018] Re: VARIANT型への値の設定方法について

石河さんへ

>
> Subject: [vcpp 00032015] VARIANT型への値の設定方法について
>
> VARIANTについて全然詳しくないんですが、replyがつかないようなので。
> VARIANTのメンバVARTYPE vtに対応する unionメンバを0にすれば良いのではない
> でしょうか。
> if( hoge.vt == VT_UI1 ){
>     hoge.bVal = 0;
> }
> みたいに。
>

ありがとうございます。 ためしに、やってみようと思います。

> 脇道へ逸れますが、これはCOBOLアプリからC/C++で作られた関数をコールすると
> かの話ですか?
> VARIANT型をサポートしたCOBOLコンパイラが存在すると言うことでしょうか。
> だとしたら何というコンパイラか教えていただけませんか?
>

日立の製品で COBOL85 Version5.0 というのを使用しています。
VARIANT型のデータについての記述がマニュアルにも載っているので
使用できるかと思います。
また、VisualBasicのようなGUIエディターで言語はCOBOLというのがあり、
製品名称はCOBOL GUIです。
このCOBOL GUIで作成した画面上でのイベントデータの受け渡しに
VARIANTが使われているのですが
製品の制限上、VARIANTから数値や文字列への変換関数は
提供されているのですが、逆のパターンは提供されていない為、
C++で上記の件を回避しようと考えているところです。

お疲れ様です。

y...@hf.rim.or.jp

ゆか
31

[vcpp 00032021] Re: Base64のDecode方法

こんにちは、嶋谷です。

At 17:00 99/08/31 +0900, you wrote:
> shimatani>
> shimatani> CFile file;
> shimatani> UINT ret;
> shimatani> LPSTR buf = new char[100*1024];
> shimatani> file.Open("file.b64", CFile::modeRead);
> shimatani> while ((ret = file.Read(buf, sizeof(buf))) != 0);
> shimatani> file.Close();

> 行単位で処理するのが普通だと思いますが,CBase64の実装によって
> は行単位にしなくても大丈夫でしょう。ところで,'\0'で終端されて
> いない気がするのですが,その点は大丈夫でしょうか?

# 使っている CBase64 は、行単位で処理するのだろうか???

確かに、\0 で終端されていないと思います。
ファイルの読み書き方法も良く分からないのですが、どうやって、最後を
検出して \0 を付加すればよいのでしょうか?

TRY、CATCH とやらもいるのでしょうか?
31

[vcpp 00032020] Re: 複数ページの印刷

YANGさん、こんにちは。
さあもとです。

Kosen YANG wrote:
> void CWvlistView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
> {
>  header(pDC); /*表のヘッダーを印刷。項目名などが含まれる。*/

>  int i=pInfo->m_nCurPage;
>  pDC->SetWindowOrg(0,-(i-1)*2300);
>  CRect rec(150,-400-2300*(i-1)+2,2010,-400-2300*i-2);
>  pDC->IntersectClipRect(&rec);

>  table(pDC); /*表を印刷*/
> }

> プレヴューでは各ページにヘッダーが印刷されるが、実際に印刷すると,
> 一ページ目のみヘッダーが印刷される。
> 印刷する時、「2ページ目のみを印刷」と設定すれば、2ページ目に
> ヘッダーが印刷されるけれども。

# 推測ですが。

IntersectClipRectで変更したクリッピング領域を戻していないの
ではないでしょうか?
SaveDC/RestoreDCを使って元に戻せばうまくいくかもしれません。

~~~~~~~~~~~~~~~~~~~~~~~~
  へ  へ    さあもと
  の  の    E-Mail : s...@suzukisoft.co.jp
~~~~~~~~~~~~~~~~~~~~~~~~
記事検索
Amazon.co.jp
  • ライブドアブログ