掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VB6で保護モードAPIを動かすには? (ID:103076)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 開発環境:VB6SP6、Windows7です。 実行環境としては、 ・Windows 7 64bit版 + IE 64bit版(InPrivate ブラウズ有効) ・Windows 7 64bit版 + IE 64bit版(InPrivate ブラウズ無効) ・Windows 7 64bit版 + IE 32bit版(InPrivate ブラウズ有効) ・Windows 7 64bit版 + IE 32bit版(InPrivate ブラウズ無効) ・Windows 7 32bit版 + IE 32bit版(InPrivate ブラウズ有効) ・Windows 7 32bit版 + IE 32bit版(InPrivate ブラウズ無効) といった組み合わせが考えられそうですね。 念のため、Windows 7 の Service Pack 状況と、 Internet Explorer のバージョンと SP も明記してください。 > IEShowSaveFileDialog関数がE_ACCESSDENIEDを返してしまい、 E_ACCESSDENIED が返されるということは、下記のコードを実行したときに、 『実行時エラー '70': 書き込みできません。』になるということでしょうか。 If rv <> 0 Then On Error Resume Next Err.Raise rv 'HRESULT の内容確認 MsgBox "実行時エラー:" & CStr(Err.Number) _ & "(0x" & Right(String(8, "0") & Hex(rv), 8) & ")" _ & Err.Description On Error GoTo 0 End If > ByVal initialFileName As String, _ API が求めているのは『__in LPWSTR lpwstrInitialFileName』ですが、 上記の定義だと、LPWSTR ではなく LPSTR の呼び出しになってしまいます。 LPWSTR に渡す場合は、宣言側を ByRef Byte (あるいは ByRef Any) にして、 Dim b() As Byte b = "文字列" & vbNullChar ret = ApiFunction( b(0) ) のように、バイト配列の先頭要素として渡してあげてください。 > ByRef filePath As String, _ その宣言で受け取れるのは、BSTR* の場合かと思います。実際には 『__out LPWSTR *lppwstrDestinationFilePath』が求められていますので、 ByVal Long あたりで宣言した方が都合が良いのでは無いでしょうか。 > rv = IEShowSaveFileDialog( _ > vbNull, _ 第一引数は | hwnd [in] | A handle to the owner window of the dialog box. | Must be a valid handle to a window that the control owns. ですから、これは明らかに違うと思いますよ。 そもそも『vbNull』というのは、API にとっては整数値「1」と同義です。 vbNull は VbVarType 列挙型として定義されており、これは Select Case VarType(variantValue) Case vbEmpty '= 0 MsgBox "これは Empty です。" Case vbNull '= 1 MsgBox "これは Null です。" Case vbInteger '= 2 MsgBox "これは Integer です。" Case vbLong '= 3 MsgBox "これは Long です。" : : End Select のように、VarType に「Null 値」が渡されたことを意味する定数です。 もしも C 言語でいうところの NULL 値を指定したいのであれば、ByVal 0& を渡しましょう。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.