掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VB6で保護モードAPIを動かすには? (ID:103080)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> rv = IEShowSaveFileDialog( _ > hwnd, _ > StrPtr("testdata.txt"), _ > StrPtr(""), _ > StrPtr(lpszExt), _ > StrPtr(lpszDefExt), _ > 1, _ > OFN_OVERWRITEPROMPT, _ > outDirPtr, _ > handle) 今回の API が、文字列引数に「LPCWSTR」と「LPWSTR」の 2 種類が使われていることに注意してください。 型名に含まれる "C" は、CONST 引数であることを意味しています。 (LP は LONG POINTER、W は WIDE(Unicode)、STR はもちろん文字列です) 先にも書きましたが、LPWSTR (あるいは LPCWSTR) に対しては、 Dim b() As Byte b = "文字列" & vbNullChar ret = ApiFunction( b(0) ) 'ByRef Byte のように、バイト配列にコピーした後、その先頭要素への参照を渡した方が無難です。 相手が LPCWSTR(C 付き) な引数である場合には、 Dim s As String s = "文字列" ret = ApiFunction( StrPtr(s) ) 'ByVal Long でも同じ効果が得られるかと思いますが、これを LPWSTR(C 無し)に対して使うのは 安全ではありません。LPCWSTR の場合は参照先が変更されないことが 保証されていますが、LPWSTR の場合は保証されていません。 文字列部(StrPtr)だけ変更されて、データ長部(StrPtr - 4)が変更されないと 不整合を起こしかねません。(変更されなければ問題は出ないのですが) それと、"testdata.txt" などの「文字列リテラル」を C 抜きの文字列型に対して渡すのも 一応避けておいた方が良いでしょう。「変数」を経由して渡すことをお勧めします。 > length = lstrlenW(outDirPtr) > ReDim bytedata(0 To length * 2) Unicode 文字列を Byte 配列で確保する場合、配列のインデックスは 1 文字なら、0〜1 2 文字なら、0〜3 3 文字なら、0〜5 となるはずですが、上記ではそうなっていませんよね。 > outStr = StrConv(bytedata, vbFromUnicode) > outStr = StrConv(bytedata, vbUnicode) これはどちらも化けるでしょうね。やるとすれば outStr = bytedata outStr = StrConv(bytedata, 0) outStr = CStr(bytedata) のいずれかだと思いますよ。(未検証)
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.