掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
DLLに文字列を受け渡しして、文字列を返すには? (ID:86833)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
話がかなり複雑化していますが、前の質問の解答を完全には理解していないのでは。 VBが使用している文字列の「BSTR」は頭に文字の先頭のアドレスがヘッダーとしてくっついています。 その為にByRefでCのDLLを呼び出すとこの先頭のポインターのポインターが渡ってしまいます。 そこでByValで呼び出しますが、実はこれはが又例外で、ByValで呼び出してもDLLには文字列の先頭 のポインターが渡るのです。従ってByValで渡していながら、 __declspec(dllexport) void __stdcall strings(LPSTR str) { while( *str != 0){ *str = toupper(*str);//大文字に変換 str++; } } の様に渡した文字列を書き換えることが可能です。 VB側で Private Declare Sub strings Lib "foo" (ByVal s As String) Private Sub Command1_Click() Dim s As String s = "hello" strings s Text1.Text = s End Sub とやって見ると文字列は大文字に変わることがわかります。 ただしこれは文字列がC側に渡した文字列の長さと同じか短い場合の話になります。 書き換える文字列が渡した文字列よりも長い場合は、メモリーの再確保が当然 発生します。この場合渡す文字列を十分長い文字列を渡すか、固定長の文字列を 渡した方がC側でBSTRに対応するより楽でしょう。ここにサンプルが有ります。 http://support.microsoft.com/default.aspx?scid=kb;ja;410837 最初の.NETSさんの質問は、文字列の長さが渡した文字列と同じか、それより短かったら 値を返す必要は無く渡す文字列をVBの側でStringの宣言をすれば良いだけになります。 ユーザー定義型での渡し方は上のサンプルの中にあります。 龍一郎さんの場合は値を返しませんからもっと単純で __declspec(dllexport) void __stdcall strings(char* str) { char s[20]; strcpy(s,str); str=strcat(s,".txt") ; } strcatはオーバーフローをチェックしません。 これでいいのでは。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.