タイトル | : Re^7: DLLへの文字列ポインタについて |
記事No | : 12329 |
投稿日 | : 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という確信は私のレベルではもてません。
ササッと作ったのは良いけど、元から初心者レベルなのにもう忘れている 自分が情けない。。。
長くなりました。
|