Question

parute13kino on Mon, 22 Apr 2013 05:07:25


はじめまして、paruteと申します。
行き詰ってしまったので、皆さんのお知恵を貸していただきたく投稿いたしました。
当方.NET初心者ですので、不足している項目があればご指摘ください。

今、作成しているアプリケーションはSharePoint上で動作しますテンプレート作成です。
そのオペレーション上、ユーザーがファイルを選び、そのファイルのアドレスを表示するというものです。
セキュリティを「完全信頼」にすると解決できる問題ですが、認証得るための権限がありません。
また、管理ツールの.NET Framework2.0 Configuration ツールを使って、イントラネットゾーンの変更も考えてみましたが、セキュリティの面もあり、取りやめになりました。

そこで、InfoPathが持っている機能ではなくWindowsが持つDLL「comdlg32.dll」を呼び出そうと考えてました。

ソースです。

Public Class GLOBALS
'-- Win32API ファイルを開くダイアログボックス
Public Declare Function GetOpenFileName Lib "comdlg32.dll" _
  Alias "GetOpenFileNameA" (ByRef lpofn As OPENFILENAME) As System.IntPtr

'--Win32APIの構造体の宣言
'-- OPENFILENAME構造体
Public Structure OPENFILENAME
・・・
End Structure
End Sub

'共通関数
Public Function apiGetOpenFileName(ByVal nHandle As Long, ByVal nFilter As String, ByVal nDir As String) As String
'--Win32APIの構造体のへの代入

'「ファイルを開く」ダイアログボックスを表示
Ret = GLOBALS.GetOpenFileName(OFN)

If Ret = 0 Then '-- [キャンセル]を押した時、 ""を返す
  apiGetOpenFileName = Microsoft.VisualBasic.Constants.vbNullString
Else '-- [OK]を押した時、ファイル名(フルパス)を返す
  apiGetOpenFileName = Microsoft.VisualBasic.Strings.Left(OFN.lpstrFile, _
  Microsoft.VisualBasic.Strings.InStr(OFN.lpstrFile, Microsoft.VisualBasic.Strings.Chr(0)) - 1)
End If

End Function

'ボタンを押すとファイル選択ダイアログが開く
Public Sub CTRL67_5_Clicked(ByVal sender As Object, ByVal e As ClickedEventArgs)
  Dim strFilter As String   'ファイルフィルタの設定
  Dim strDir As String      'デフォルトのフォルダ位置
  Dim Hwnd As IntPtr
  Dim strFileName As String 'ファイル名(フルパス)
  strFilter = "すべてのファイル(*.*)" & Microsoft.VisualBasic.Strings.Chr(0) & "*.*" & Microsoft.VisualBasic.Strings.Chr(0)
  strDir = "c:\"
  Hwnd = GLOBALS.GetDesktopWindow()
  strFileName = apiGetOpenFileName(Hwnd, strFilter, strDir) 'ダイアログ表示
End Sub

実際にコーディングし、エラーもないのですが、
実行しても何も表示されません。
実行時エラーが出れば、何とか糸口が見つけられるのですが、
何も表示されず、動作しません。
何か情報をお持ちの方、参考になる情報を教えてはいただけませんでしょうか?

よろしくお願い致します。


Sponsored



Replies

Azulean on Mon, 22 Apr 2013 14:01:00


InfoPath は詳しくないので、外してたらすみません。

.NET の世界での一般論として、Win32API へのアクセス、つまり、アンマネージコードへのアクセスも権限が必要な行為です。
何か例外が発生しているのではないでしょうか?
(Win32API を使って回避できるなら、部分信頼という仕組みに意味がありません。理由は、たいていの .NET のコードは Win32API を使えば代替できるため)

parute13kino on Tue, 23 Apr 2013 09:08:13


Azulean 様

返信ありがとうございます。

.NETは始めたばかりで、分からないことも多く非常に助かります。
アンマネージコードへのアクセスも権限が必要だということはMSDNでなんとか分かりました。
と、なれば、Visual Studioで作成したマネージコードのDLLを読み込ませても同じようにアクセスと権限が必要になるということですね…。

実現したいことは、ユーザーが選択したファイルのパスの取得なんですが、どうしてもこの部分が引っかかってしまいます。
もう少し、回避策を模索してみます。
ありがとうございます。

また、他にも情報がありましたら、ご教授いただけると助かります。

星 睦美 on Wed, 24 Apr 2013 02:12:02


フォーラム オペレーターの星 睦美です。
parute12kino さん、こんにちは

Azulean さんからの返信にもありますが(「何か例外が発生しているのではないでしょうか?」)トラブルシューティングの手がかりにはエラーに関する情報が重要になります。今回はparute12kino さんの質問では「実際にコーディングし、エラーもないのですが」とのことで、Azulean さんの回答を手がかりのひとつとして調査いただければと思います。

私のほうから、同様の情報を探してこちらのスレッドを読まれる方の参考までにWin32 API のエラーの確認方法を説明したページをご紹介します。

・Win32 APIのWin32エラー・コードを取得するには?[C#、VB]:
http://www.atmarkit.co.jp/fdotnet/dotnettips/740win32errcode/win32errcode.html

Visual Studio に関する質問がありましたら、Visual Studio Development フォーラムがお役にたつと思います。
ぜひご活用ください。

parute13kino on Tue, 07 May 2013 09:47:40


星 睦美 様

ご返信ありがとうございます。

ご提示いただいた「Win32 APIのWin32エラー・コードを取得するには?[C#、VB]」を参考にエラーを見てみましたところ、

「87:パラメータが間違っている」と返ってきました。

これを元に調査していきたいと思います。

助言ありがとうございます。