tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^7: DLLへの文字列ポインタについて
投稿日: 2008/05/21(Wed) 15:16
投稿者neptune
こんにちは
 
> 確かに、常道から外れるとろくな事はありませんね。
はい、自分で詳しく判断できないときはやはり常道というか安全側に
なってしまいます。^ ^;

> 一点お聞きしたいのですが、
> StrPtrを使った方法、私の実験ではDLLから参照可能でした。
> neptune様の確認時、何か問題があったのでしょうか?
> ちなみに、
> > StrPtr(StrConv("test.txt", vbFromUnicode)) ' ファイル名
> ではなく、
> strct_d.lptr = StrPtr(StrConv("test.txt", vbFromUnicode)) ' ファイル名
> ですね。
> 訂正します。
すみません。StrConvでvbFromUnicodeにするのを忘れていたような気がします。
書いたときはANSIに変換ってのをすっかり忘れていました。
コード自体はもう無いので、記憶ですが、
strct_d.lptr = StrPtr("test.txt")
のように書いていたと思います。

確認しましたが、ccさんの上記コードで動きました。
お騒がせしました。

以下独り言になるんですが、最初の自分の実験コードで再検証したんですが、
・・・なぜかしら、処理自体は正常に終わるんですが、VBを終了する際
異常終了しました。?DLLのつくりが悪いんだろうか、それとも文字列
の受け渡しが悪いんだろうか悩んだんですが、
もう一度ソースを見たら、
    sbuf = lpstrct->lptr;
    itoa(length,slen,10);
    strcat(sbuf,"\n文字数は : ");
    strcat(sbuf,slen);
と文字列操作をしています。多分このせいでメモリ操作がおかしくなったんでしょうね。
そこを以下のような直しました。

EXPORT int __stdcall structTest(HWND hWnd,STRCT *lpstrct){
    int length;
//    char *sbuf;
    char smsg[256];
    char slen[10];

    length = strlen(lpstrct->lptr);
//    sbuf = lpstrct->lptr;
    itoa(length,slen,10);
    strcpy(smsg,lpstrct->lptr);
    strcat(smsg,"\n文字数は : ");
    strcat(smsg,slen);
    MessageBox(hWnd,smsg,"structText",MB_OK);
    return length;
}
これで正常終了するようになりました。

やはり、参照は害の無いようにも思えますが、操作したら確実に駄目ですね。
やっぱり、BSTRが固い(面倒だけど)。

ちなみに修正前のDllでccさんのようにANSIに変換して、ポインタ渡しすると
正常終了しました。でもOKという確信は私のレベルではもてません。

ササッと作ったのは良いけど、元から初心者レベルなのにもう忘れている
自分が情けない。。。

長くなりました。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。