0

みなさん、こんばんは。

Windows Mobile 6.5 を実行しているデバイスにインストールされているソフトウェアに取り組んでいます。一部は、デバイスのカメラを適切に使用しています。私の状況では、CameraCaptureDialog を次のように使用したいと考えています。

Dim cameraCaptureDialog As New CameraCaptureDialog()
cameraCaptureDialog.Owner = Me
cameraCaptureDialog.Mode = CameraCaptureMode.Still
If cameraCaptureDialog.ShowDialog() = DialogResult.OK AndAlso cameraCaptureDialog.FileName.Length > 0 Then
    Dim sFileNameExt As String = ""
    Dim sFileDir As String = ""
    Dim sPicsDir As String = ""
    Dim sFileSource As String = ""
    sFileSource = Path.GetFullPath(cameraCaptureDialog.FileName)
    sFileDir = Path.GetDirectoryName(cameraCaptureDialog.FileName)
    sFileDir = Path.GetPathRoot(cameraCaptureDialog.FileName)
    sFileNameExt = Path.GetExtension(cameraCaptureDialog.FileName)
    Dim fs As New FileStream(sFileSource, FileMode.OpenOrCreate, FileAccess.Read)
    Dim ImgArtikel(CType(fs.Length, Int32)) As Byte
    fs.Read(ImgArtikel, 0, CType(fs.Length, Int32))
    fs.Close()
    functions.ConnectLocalDB(functions.localconn)
    Dim cmd As SqlCeCommand = functions.localconn.CreateCommand()
    cmd.CommandText = "UPDATE table SET img_Photo=@imgArt "  'assign the newly made image to db-entry
    cmd.Parameters.Add("@imgArt", SqlDbType.Image)
    cmd.Parameters("@imgArt").Value = ImgArtikel
    cmd.ExecuteNonQuery()
    cmd.Dispose()
    If File.Exists(sFileSource) Then File.Delete(sFileSource) 'delete photo after updating db

End If
cameraCaptureDialog.Dispose()

これは初めて (エミュレーターとデバイスの両方で) 正常に動作しますが、同じイベントを開始すると、ソフトウェアがクラッシュします。デバッグ時に例外は発生しません。ShowDialog() (4 行目) でクラッシュするだけです。

ここで何が悪いのか誰か知っていますか?

4

1 に答える 1

0

このルーチンがビジーであることを認識しているグローバル変数を設定する必要があります。

private cameraWorking As Boolean

免責事項:私はVBをあまり使用しないことに注意してください。そのため、構文の一部が少しずれている可能性がありますが、これで理解できるはずです。)

sPicsDiryou assign を2 回使用しないことに気付きましたsFileDir

私はUsingキーワードの大ファンでもあります。これは、接続のクローズとオブジェクトの破棄を処理することになっています。

それを念頭に置いて、私はあなたのルーチンを書き直し、決して使用されないか不要なアイテムをコメントアウトしました(Usingルーチンで)。

If Not cameraWorking Then
  Try
    cameraWorking = True
    Using cameraCaptureDialog As New CameraCaptureDialog()
      cameraCaptureDialog.Owner = Me
      cameraCaptureDialog.Mode = CameraCaptureMode.Still
      If cameraCaptureDialog.ShowDialog() = DialogResult.OK Then
        Dim filename As String = cameraCaptureDialog.FileName
        If Not String.IsNullOrEmpty(filename) Then
          Dim sFileSource As String = Path.GetFullPath(cameraCaptureDialog.FileName)
          'Dim sFileNameExt As String = Path.GetExtension(cameraCaptureDialog.FileName)
          'Dim sFileDir As String = Path.GetDirectoryName(cameraCaptureDialog.FileName)
          'Dim sRootDir As String = Path.GetPathRoot(cameraCaptureDialog.FileName)
          functions.ConnectLocalDB(functions.localconn)
          Using fs As New FileStream(sFileSource, FileMode.OpenOrCreate, FileAccess.Read)
            Dim ImgArtikel(CType(fs.Length, Int32)) As Byte
            fs.Read(ImgArtikel, 0, CType(fs.Length, Int32))
            Using cmd As SqlCeCommand = functions.localconn.CreateCommand()
              cmd.CommandText = "UPDATE table SET img_Photo=@imgArt "  'assign the newly made image to db-entry
              cmd.Parameters.Add("@imgArt", SqlDbType.Image)
              cmd.Parameters("@imgArt").Value = ImgArtikel
              cmd.ExecuteNonQuery()
              'cmd.Dispose()
            End Using
            ' Note that you may still need to explicitly close the stream here
            ' because the GC will likely still have it open in the call below to delete
            ' the actual file.
            fs.Close()
          End Using
          If File.Exists(sFileSource) Then
            File.Delete(sFileSource) 'delete photo after updating db
          End If
        End If
      End If
      'cameraCaptureDialog.Dispose()
    End Using
  Catch err As Exception
    MessageBox.Show(Me, err.Message, "Camera Capture Error")
  Finally
    cameraWorking = False
  End Try

これがすべてフォーム上のボタン クリックの結果として発生する場合は、より直感的に設定できます。

My.cameraCaptureButton.Enabled = False

Finallyルーチンの開始時に、ブロック 内のボタンを再度有効にすることを忘れないでください。

于 2013-01-30T14:59:03.837 に答える