mcrblog

vcpp-ml

2002年07月

31

[vcpp 00058958] 引数で実行したい関数を指定する

細野です。
初歩的なことですが、聞きたいことがあるのでよろしくお願いします。

関数の引数で、その関数内で実行して欲しい関数を指定するには
どのような方法を取ればいいのでしょうか。
WindowsAPIのSetTimer関数の最後の引数で、コールバックされる関数
を指定できますが、これと同じような感じにしたいと思ってます。

具体的には、
タイマを発行して(SetTimerなりマルチメディアタイマなり)、コールバック
で呼び出される関数に来たときに、実行したい処理が書かれた関数を
呼び出したい。のです。
引数での関数の渡し方と、渡された引数からどのように関数を実行する
のか知りたいです。

ご教授よろしくお願いします。

・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・
細野裕矢

Email -> h...@pastel.ocn.ne.jp
・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・
31

[vcpp 00058958] 引数で実行したい関数を指定する

細野です。
初歩的なことですが、聞きたいことがあるのでよろしくお願いします。

関数の引数で、その関数内で実行して欲しい関数を指定するには
どのような方法を取ればいいのでしょうか。
WindowsAPIのSetTimer関数の最後の引数で、コールバックされる関数
を指定できますが、これと同じような感じにしたいと思ってます。

具体的には、
タイマを発行して(SetTimerなりマルチメディアタイマなり)、コールバック
で呼び出される関数に来たときに、実行したい処理が書かれた関数を
呼び出したい。のです。
引数での関数の渡し方と、渡された引数からどのように関数を実行する
のか知りたいです。

ご教授よろしくお願いします。

・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・
細野裕矢

Email -> h...@pastel.ocn.ne.jp
・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・ ・・・・・
31

[vcpp 00058957] Re: コンボボックスに「文字変換」フラグを指定した場合の動きについて

>島野です。

外垣です、こんばんは。


>AddString() 関数が呼び出している、CharUpperBuff() API あたりで、
>コケているようです。
>試しに、以下のようなテストコードを書いてみたら、やはり同じ場所で、
>落ちました。(文字リテラルを渡すのがマズイようです)
># って、やっぱり M$ のバグっぽい気がするんですけど・・・(^^;;;

ということはですよ、

> 6. スタック変数を指定した場合は、問題ないらしい。
>    例1)
>    TCHAR szData[] = _T("aaa");
>    m_cbTest.AddString( szData );
>    例2)
>    CString strData = _T("aaa");
>    m_cbTest.AddString( strData );   

ってやった後に両者のバッファの内容は書き変わっているのでしょうか?
それとも内部的に、書き換えた後にさらに書き戻しているの?


以上、出来たら試して欲しい。 < 興味あるのに時間はない
31

[vcpp 00058957] Re: コンボボックスに「文字変換」フラグを指定した場合の動きについて

>島野です。

外垣です、こんばんは。


>AddString() 関数が呼び出している、CharUpperBuff() API あたりで、
>コケているようです。
>試しに、以下のようなテストコードを書いてみたら、やはり同じ場所で、
>落ちました。(文字リテラルを渡すのがマズイようです)
># って、やっぱり M$ のバグっぽい気がするんですけど・・・(^^;;;

ということはですよ、

> 6. スタック変数を指定した場合は、問題ないらしい。
>    例1)
>    TCHAR szData[] = _T("aaa");
>    m_cbTest.AddString( szData );
>    例2)
>    CString strData = _T("aaa");
>    m_cbTest.AddString( strData );   

ってやった後に両者のバッファの内容は書き変わっているのでしょうか?
それとも内部的に、書き換えた後にさらに書き戻しているの?


以上、出来たら試して欲しい。 < 興味あるのに時間はない
31

[vcpp 00058955] Re: コンボボックスに「文字変換」フラグを指定した場合の動きについて

島野です。

> とりあえずの回避方法としてはスタック変数を指定すれば落ちなくなるので、
> それで対応しようと思いますが、何故落ちるのかが分かりません。

とりあえず原因は、わかりました。
Dr.ワトソンで、コールスタックを吐き出したら、
AddString() 関数が呼び出している、CharUpperBuff() API あたりで、
コケているようです。
試しに、以下のようなテストコードを書いてみたら、やはり同じ場所で、
落ちました。(文字リテラルを渡すのがマズイようです)
# って、やっぱり M$ のバグっぽい気がするんですけど・・・(^^;;;

<テストプログラム>
-----------------------------------------------------------------------------
int SetData( LPCTSTR lpszData )
{
    try
    {
        TRACE2( "lpszData = [%s](0x%08X)\n", lpszData, lpszData );
        CharUpperBuff( (LPTSTR)lpszData, lstrlen(lpszData) );
        //             ^^^^^^^^^^^^^^^^ 読み取り専用メモリを書き換えている!?
        TRACE2( "lpszData = [%s](0x%08X)\n", lpszData, lpszData );
    }
    catch( ... )
    {
        TRACE0( "Abnormal termination.\n" );
    }
    return 0;
}

int test()
{
    TCHAR szData[]          = _T("aaa");
    static TCHAR s_szData[] = _T("bbb");
    CString strData         = _T("ccc");
    LPCTSTR p               = _T("ddd");
//  SetData( szData );    // 落ちない
//  SetData( s_szData );  // 落ちない
//  SetData( strData );   // 落ちない
//  SetData( p );         // 落ちる
//  SetData( _T("eee") ); // 落ちる

    return 0;
}

void CTestDlg::OnButton1() 
{
//  m_cbTest.AddString( _T("aaa") );        // 落ちる
//  m_cbTest.InsertString( 0, _T("aaa") );  // 落ちる
//  m_cbTest.SetWindowText( _T("aaa") );    // 落ちない
    test();                                 // 落ちる
}

-----------------------------------------------------------------------------

ということで、とりあえず原因は、わかったのですが、良い回避方法が思いつきません。
今のところ、
-----------------------------------------------------------------------------
1. 人海戦術で 文字リテラル _T("") を (CString)_T("") のように置換する
2. 「1.」をマクロで置換する。
3. SetData() のような関数を用意し、その中で CString に変換する。
-----------------------------------------------------------------------------
と言った方法を考えているのですが、他に何か良い案などありませんでしょうか?

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