DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
Nomal参照dllへの文字列引数をutf8で渡したい。(13) | NomalFILE.COPYでIOExceptionエラーが出る(11) | Nomalリストを別フォームに渡す方法(9) | Nomal例外発生した場合に変数をcatchに渡したい(9) | NomalCode128でバーコードが読み取れない(8) | Nomalモードレスフォーム Warning IDE0067を回避したい(7) | NomalIE11では表示されるが、.netのWebBrowserでは、表示されないHPを表示する方法(7) | Nomal数字だけで構成されてるCSVフィールドが自動的に数値として解釈される(7) | NomalフォームコントロールへのDataBindingsでプロパティが相互反映されない(7) | Nomal起動ディスプレイの指定方法について(6) | NomalListBoxにデータが表示されない(6) | Nomal文字列を8bit に戻してから UTF-8 に変換する方法(6) | NomalSQLServerテーブル内容をDataGridViewに表示するコードについて(6) | Nomal文字列構造体のListのソート(6) | NomalWebBrowser Controlを使って、任意の値を取得(5) | Nomalこんな演算子初めて見ました。(5) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(5) | NomalあるWindows10PCでビルドしたEXEがW8.1以下で実行エラー(5) | Nomalポルトガル語の登録(5) | Nomaloo4oのAddTableをADOに移行したい(5) | NomalDeclare宣言するdllと参照追加をするdllの区別(4) | NomalVS2017で作成されたDLLをVS2005で作成されたAPで使用する方法(4) | Nomalフォルダ内の全ての容量を取得したい(4) | Nomal共変性と反変性ってこういうこと?(4) | Nomalプロセスからウインドウを取得(4) | NomalNewの使い方間違ってますか?(4) | Nomalユーザーコントロール内のテキストボックスのmodifiedプロパティ(4) | NomalJOIN操作の構文エラー(4) | Nomal動的にプロパティや変数の値の取得(4) | NomalVB6 ほかのアプリケーションを起動し そのアプリケーションは終了させる方法(4) | Nomalスクロールバーが出た時に高さを変えたい(4) | NomalDatagridViewの行高さ変更について(4) | NomalLINQのメソッド構文の書き方(3) | Nomalvb.net+SQLiteで複数データベースファイルへのトランザクション方法(3) | Nomalジェネリック型インターフェースを使った変数を扱いたい(3) | NomalProcess.WaitForExitで正常に動作しない?(3) | NomalPictureBox.Locationのキャンセル(3) | NomalCatch時のex.StackTraceの情報(3) | NomalVisualStudioでマクロ(3) | NomalOracleDataAccess を参照したプログラムでデバッグモードが機能しなくなる(3) | NomalVisualStudioでExcelのVSTO開発(3) | NomalVB.NETでCSVを読み込む際にSQL文を使いたい(3) | NomalDrawImage でメモリ不足エラー(3) | NomalVb.netからAccessへの接続について(3) | Nomal令和の日付への対応(3) | NomalHTTP 417エラーを発生させるためのIIS設定はどうすればよいか(3) | NomalDrawString前のFillRectangle有無により文字の太さが違う理由について教えて下さい(3) | NomalPIctureBox同士を論理合成したい(3) | Nomalデータセット定義ファイルからDataTable(3) | Nomalネットの画像の複数枚を重ね合わせたい(3) | NomalDataGridViewで検索をかける方法(3) | NomalDataGridViewの選択時の色を透明にしたい(3) | NomalWebBrowserでWebページからのメッセージ(3) | NomalASP.NETから呼ばれているかどうか判定する方法(3) | NomalCA2213の警告が消えません(3) | NomalC# 現在のコンテキスト内にxxxという文字は存在しませんと出ます(3) | NomalTaskクラスを.NET Framework 2.0で実現させる方法(2) | NomalWebBrowser Control foreachで値が消える(2) | NomalEditボックスに簡体字をセットする方法(2) | NomalWebClientが上手く動かない(2) | Nomalフォーム外のカーソルの変更(2) | Nomalラムダ式の勉強中(2) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(2) | NomalC#をVBに変換(2) | NomalWebClientで、短期間にDownloadStringAsyncを実行したい(2) | NomalマウスのないOSでマウスカーソルの表示(2) | NomalToolStripMenuItemにShortcutKeysを指定した際の、元のコントロールを取得する方法(2) | NomalMouseEventArgsのカレント座標(2) | Nomalリッチテキストボックスでの字間の調整(2) | NomalVC++ → VB.Netに変換時に文法エラー(2) | NomalSQL-Server Compact 4.0が表示されない(2) | Nomalバーコードの数字を非表示にしたい(2) | Nomal自作したアプリの発行元を明記したい(2) | NomalSystem.Threading.Thread.Sleep()と変数(2) | NomalDataGridView 行の背景色の設定(2) | NomalDatagridviewのクリア(2) | NomalnumericUpDwonコントロールのvalue(2) | NomalVisual Studio DataTableの値のアクセスの仕方(2) | NomalDataTableの構造が同じか調べるメソッド(2) | NomalRejectChangesについて(2) | NomalPC機種によってスタートアップ画面が中央から左上にずれる、Fontがおかしくなる。(2) | Nomalタスクスケジュール登録時の例外メッセージ(2) | Nomal管理者モードでクリック(2) | NomalVB2017でのインストーラ作成時のエラーについて(2) | NomalMicrosoft Azure OCRのサンプルコード実行時エラー(2) | Nomalデータバインド時のDataGridViewのカスタムソート(2) | NomalObject型からDecimalへの変換(2) | Nomal擬似言語をVBのプログラミングに変換(2) | Nomalユーザーコントロールのプロパティが保存されない(2) | NomalWindows10(1803)からGetHostEntryでipv4が取得出来ない場合がある(2) | Nomal自分自身を呼び出すのはOKですか(1) | NomalList型でエラーが起きてしまい・・・(1) | NomalLINQの拡張メソッドの定義(1) | NomalWebRequest でメモリが解放されない(1) | NomalFunction プロシージャからの文字選択(1) | NomalRDP接続でのネットワーク帯域制限(0) | Nomal必須コンポーネントの一覧に追加したい(0) | NomalApp.configのMy.Application.Log設定で使用できない属性が出る(0) | Nomalvb2010を使用したmicrosoft Wordの任意の行の削除(0) | NomalWinFormsでWindows10のカメラアプリと連携したい(0) |



■記事リスト / ▼下のスレッド
■34090 / 親記事)  参照dllへの文字列引数をutf8で渡したい。
□投稿者/ ukots 一般人(1回)-(2019/01/12(Sat) 11:01:07)
  • アイコン環境/言語:[VB.NET on Windows7] 
    分類:[.NET] 

    vbnetに第三者のdllを参照しようとしているが、渡すべき引数の一つがUTF8の文字列変数(String)という仕様となっています。vbnet上では文字列変数はすべてUNICODEに限定されているため、どうしてもUNICODEの文字列を渡すことになり、正常に作動しません(文字化けなど)。なにか良い解決策があればご意見ください。
違反を報告
引用返信

▽[全レス13件(ResNo.9-13 表示)]
■34103 / ResNo.9)  Re[4]: 参照dllへの文字列引数をutf8で渡したい。
□投稿者/ ukots 一般人(8回)-(2019/01/17(Thu) 10:16:14)
  • アイコンNo34102に返信(魔界の仮面弁士さんの記事)

    NLPIR_ParagraphProcessの件、ご指示通り行いました。うまく行きそうです。
    UTF8のバッファーをUnicodeにEncodingして、末尾の0hを消去して実用に供する予定です。

    なお、「戻り値で返される文字列のメモリ解放」については特段手立てを設けずともいまのところエラーが出ません。

    魔界の仮面弁士さん、天才だね。有り難うございました。

    PS: NLPIR_FileProcess(FileName,FileName,1) As Doubleについては、NLPIR_FileProcess自体がUTF8でWindows側のファイルにアクセスしようとすることは、そのままではどうにも対処できるものではないのであきらめですね。
    ではこれにて解決済みとします。


違反を報告
引用返信
■34104 / ResNo.10)  Re[5]: 参照dllへの文字列引数をutf8で渡したい。
□投稿者/ 魔界の仮面弁士 大御所(1191回)-(2019/01/17(Thu) 12:42:37)
  • アイコンNo34103に返信(ukotsさんの記事)
    > UTF8のバッファーをUnicodeにEncodingして、末尾の0hを消去して実用に供する予定です。

    あれ? lstrlenA は「0h の直前までのバイト数」を返すので、
    取得したバッファー内に 0h が含まれることは無いはずなのですが…。

    たとえば UTF-8 文字列のバイナリ表現が
     { &HE5, &HBC, &H81, &HE5, &HA3, &HAB,  &H0  , &HCE, &HB2 }
    だったとしたら、戻り値は 7 では なく 6 ですし、
     { &H0  , &HE5, &HBC, &H81, &HE5, &HA3, &HAB, HCE, &HB2 }
    だった場合、戻り値は 1 ではなく 0 となります。


    もしかして、
    > (3) 受信バッファとして、その長さの Byte 型 1 次元配列を確保する
    > (4) 確保したバッファに、Marshal.Copy( IntPtr, Byte(), Integer, Integer) メソッドで複写
    の手順で、サイズ指定をミスっていたりはしませんか?


    > PS: NLPIR_FileProcess(FileName,FileName,1) As Doubleについては、

    この API ですよね。第 3 引数は Optional ByVal bPOStagged As Integer = 1 かな。

    Double NLPIR_FileProcess(
     const char *sSourceFilename,
     const char *sResultFilename,
     int bPOStagged = 1);


    この場合の入力引数も、先の戻り値と同様、「Encoding.UTF8 を使って自前で変換する」だけです。

    現状の引数宣言が、
     <MarshalAs(UnmanagedType.LPStr)> ByVal sSourceFilename As String
    になっているのだとしたら、それを
     ByVal sSourceFilename As Byte()
    もしくは
     ByVal sSourceFilename As IntPtr
    にしてみてください。


    As Byte() で渡す場合は、 No34093 で Hongliang さんが書かれたコードそのままです。
     Dim bytes As Byte() = Encoding.UTF8.GetBytes("Source.txt" & vbNullChar)


    As IntPtr で渡す場合は、
     Dim ptrSrc As IntPtr = Marshal.StringToHGlobalUTF8( "Source.txt" & vbNullChar )
     Dim ptrDst As IntPtr = Marshal.StringToHGlobalUTF8( "Result.txt" & vbNullChar )
     Dim ret As Double = NLPIR_FileProcess( ptrSrc, ptrDst, 1 )
     Marshal.FreeHGlobal( ptrDst )
     Marshal.FreeHGlobal( ptrSrc )
    としたいところですが……残念ながら StringToHGlobalUTF8 なんていうメソッドは無いので、こんな感じで。
     Dim bytes As Byte() = Encoding.UTF8.GetBytes("Source.txt" & vbNullChar)
     Dim ptrSrc As IntPtr = Marshal.AllocHGlobal( bytes.Length )
     Marshal.Copy(bytes, 0, ptrSrc, bytes.Length)
     Dim ptrDst As IntPtr
     '中略:ptrDst も ptrSrc と同様の手順で、AllocHGlobal + Copy で UTF-8 バッファを作成
     Dim ret As Double = NLPIR_FileProcess( ptrSrc, ptrDst, 1 )
     Marshal.FreeHGlobal( ptrDst )
     Marshal.FreeHGlobal( ptrSrc )
違反を報告
引用返信
■34105 / ResNo.11)  Re[6]: 参照dllへの文字列引数をutf8で渡したい。
□投稿者/ ukots 一般人(9回)-(2019/01/17(Thu) 17:03:14)
  • アイコンNo34104に返信(魔界の仮面弁士さんの記事)

    Dim intptr As Integer = NLPIR_ParagraphProcess(ybyt, 1)
    Dim plen As Integer = lstrlenA(intptr)
    Dim bf(plen - 1) As Byte
    Marshal.Copy(intptr, bf, 0, bf.Length)
    Dim pstr As String = System.Text.Encoding.UTF8.GetString(bf)
    これで0hは付加されませんでした。

    Double NLPIR_FileProcess(
     const char *sSourceFilename,
     const char *sResultFilename,
     int bPOStagged = 1);については、

    Dim srcStr As String = "d:\data\漢字\temp.txt"
    Dim dstStr As String = "d:\data\漢字\result.txt"

    Dim bytSrc As Byte() = Encoding.UTF8.GetBytes(srcStr & vbNullChar)
    Dim ptrSrc As IntPtr = Marshal.AllocHGlobal(bytSrc.Length)
    Marshal.Copy(bytSrc, 0, ptrSrc, bytSrc.Length)

    Dim bytDst As Byte() = Encoding.UTF8.GetBytes(dstStr & vbNullChar)
    Dim ptrDst As IntPtr = Marshal.AllocHGlobal(bytDst.Length)
    Marshal.Copy(bytDst, 0, ptrDst, bytDst.Length)

    Dim ret As Double = NLPIR_FileProcess(ptrSrc, ptrDst, 1)
    では機能しません。

    上記でディレクトリの漢字を削除したPathでは問題なくresult.txt作成され、内容も期待したものが入っていました。つまり、
    Dim srcStr As String = "d:\data\temp.txt"
    Dim dstStr As String = "d:\data\result.txt"

    NLPIR_FileProcessにutf8のファイルパスを渡せても、NLPIR_FileProcessからutf8のままでWindowsのファイルシステムにアクセスしてもファイルを探せないのだろうと素人的に推測しています。

    以上。


違反を報告
引用返信
■34106 / ResNo.12)  Re[7]: 参照dllへの文字列引数をutf8で渡したい。
□投稿者/ 魔界の仮面弁士 大御所(1192回)-(2019/01/17(Thu) 19:41:47)
  • アイコン2019/01/17(Thu) 20:51:04 編集(投稿者)

    No34105に返信(ukotsさんの記事)
    > Dim bf(plen - 1) As Byte

    そうですね。それで OK だと思います。

    丸括弧内は「配列の要素数」ではなく「最大インデックス番号」ですので
    「バッファの長さ - 1」を指定することになります。

    たとえば 4 バイトのバッファなら、
    Dim bf(0 To 3) As Byte な範囲になる換算ですね。


    > Dim srcStr As String = "d:\data\temp.txt"
    > Dim dstStr As String = "d:\data\result.txt"

    結果報告ありがとうございます。

    ASCII なパスを UTF-8 変換したバイナリとして渡すのは OK だったということは
    それは DLL 側の不具合(もしくは制限)である可能性が考えられます。


    おそらくは、ファイル アクセスに用いられている Windows API が
    Wide バージョン(たとえば CreateFileW 関数など)ではなく、
    Ansi バージョン(たとえば CreateFileA 関数など)になっているのでしょう。


    すなわちこれは、ファイルパスに対して
     日本語版 Windows で実行した場合は CP932 (Shift_JIS 相当) の文字列
     繁体字版 Windows で実行した場合は CP950 (Big5 相当) の文字列
     簡体字版 Windows で実行した場合は CP936 (GBK/GB2312 相当) の文字列
    しか渡せないということを意味します。


    つまり、パス引数に対して使うのは Encoding.UTF8 や Encoding.Ascii や Encoding.Unicode ではなく、
     Encoding.Default.GetBytes(srcStr & vbNullChar)
     Encoding.GetEncoding(932).GetBytes(srcStr & vbNullChar)
     Encoding.GetEncoding(936).GetBytes(srcStr & vbNullChar)
     Encoding.GetEncoding(950).GetBytes(srcStr & vbNullChar)
    のいずれかであったものと推察します。
    ※ただし strSrc の中身が OS 既定のコードページで扱える文字のみであることが条件


    そしてもし、Encoding.Default で呼び出せる文字列である場合、
    ANSI バージョンであることを明示するために、API の引数宣言を

    Declare Ansi Function NLPIR_FileProcess Lib "NLPIR" ( _
     <MarshalAs(UnmanagedType.LPStr)> ByVal sSourceFilename As String, _
     <MarshalAs(UnmanagedType.LPStr)> ByVal sResultFileName As String, _
     Optional ByVal bPOStagged As Integer = 1) As Double

    もしくは

    <DllImport("NLPIR.DLL", CharSet:=CharSet.Ansi)> _
    Function NLPIR_FileProcess(
     <MarshalAs(UnmanagedType.LPStr)> ByVal sSourceFilename As String, _
     <MarshalAs(UnmanagedType.LPStr)> ByVal sResultFileName As String, _
     Optional ByVal bPOStagged As Integer = 1) As Double
    End Function

    の形式に修正することでも、ファイルパスを渡すことが出来るのでは無いでしょうか。


    > Dim srcStr As String = "d:\data\漢字\temp.txt"

    上記のように、API 宣言で Ansi 版であることを明示した場合、
    As String な引数に "漢字" という文字列が渡されたときには
      日本語 Windows では 8A, BF, 8E, 9A
      繁体字 Windows では BA, 7E, A6, 72
      簡体字 Windows では 9D, 68, D7, D6
    というバイナリに自動変換されてから DLL に渡される見込みです。
違反を報告
引用返信
■34107 / ResNo.13)  Re[8]: 参照dllへの文字列引数をutf8で渡したい。
□投稿者/ ukots 一般人(10回)-(2019/01/18(Fri) 09:21:45)
  • アイコンNo34106に返信(魔界の仮面弁士さんの記事)

    皆様、おかげさまで懸案のdllを使えるようになりました。種々のアドバイス、大変勉強になりました。また、別件あるいは今回の延長線で何かあれば寄稿させていただきます。
    御礼と記事を閉じることの報告まで。

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-9] [10-13]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34273 / 親記事)  FILE.COPYでIOExceptionエラーが出る
□投稿者/ オフィス・ケイ 一般人(1回)-(2019/07/03(Wed) 09:25:29)
  • アイコン環境/言語:[WindowsCE6.0 VB.NET2008 .NET Compact FrameWork3.5 ] 
    分類:[.NET] 

    初めまして。
    初めて投稿します。

    現在、Vb.net2008でPDAの開発を行っています。
    PDAのOSはWindows CE6.0になります。
    フレームワークは.net CompactFrameWork3.5です。

    処理内容として、PDAで作成されたテキストファイルをネットワーク越しの共有フォルダにコピーしています。

    File.COYを使用しているのですが、稀にシステムエラー(IOException)で処理が落ちるのです。
    原因として何が考えられるのでしょうか?
    ネットワークは無線LANで接続しています。

    ----- 参考ソース ------

    sFileRireki:送信元ファイル
    sFileTRireki:送信先ファイル
    psInit.sUpLoadD:送信先フォルダ

    Try

    If File.Exists(sFileRireki) = True Then 'あり
    If Directory.Exists(psInit.sUpLoadD + "\") = False Then
    sErrMsg = "アップロード先フォルダが無いか、ネットワーク接続できませんでした。(COPY直前チェック)" + vbCrLf + psInit.sUpLoadD
    Return False
    End If
    IO.File.Copy(sFileRireki, sFileTRireki,True)
    '送信後、削除
    If File.Exists(sFileRireki) = True Then
    File.Delete(sFileRireki)
    Else
    Return False
    End If
    Else
    Return False
    End If
    Catch ex As Exception
    sErrMsg = "アップロード(履歴データ送信)に失敗しました。" + vbCrLf + vbCrLf + ex.Message
    Return False
    Finally
    Call sub_WriteLog(sErrMsg, "", pciLogModeE, "fnc_LogDataSend")
    End Try

    ------- エラー内容 ----------

    アップロード(履歴データ送信)に失敗しました。IOException

    以上になります。
    よろしくお願いします。

違反を報告
引用返信

▽[全レス11件(ResNo.7-11 表示)]
■34280 / ResNo.7)  Re[6]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ オフィスケイ 一般人(2回)-(2019/07/10(Wed) 08:05:16)
  • アイコンNo34278に返信(魔界の仮面弁士さんの記事)

    > ユーザー環境でのみ発生する事象という事で追跡しにくいですが、
    > 母艦(ファイル送信先)側で監査ログを取るようにして、
    > 例外が発生した時刻付近のイベント ビューワーのログが、
    > いつもと違う内容になっていないか確認してみては如何でしょう。



    =>ご回答ありがとうございます。
     監査ログを取るなどして、もう少し調べてみたいと思います。


違反を報告
引用返信
■34281 / ResNo.8)  Re[2]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ オフィスケイ 一般人(3回)-(2019/07/10(Wed) 08:07:18)
  • アイコンNo34279に返信(kikuさんの記事)
    >
     回答ありがとうございます。
     ご提示して頂いた内容を踏まえ、いろいろとやってみたいと思います。
     ありがとうございました。
違反を報告
引用返信
■34282 / ResNo.9)  Re[4]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ オフィス・ケイ 一般人(2回)-(2019/07/16(Tue) 13:13:25)
  • アイコンNo34276に返信(魔界の仮面弁士さんの記事)
    > ■No34275に返信(オフィス・ケエイさんの記事)
    >
    > また、エラー発生時点の StackTrace を記録することは出来ますか?
    > (Exception の ToString でも OK です)

    => 下記にExceptionのToStringを取りました。

    System.IO.IOException:
    IOException
    場所 System.IO.__Error.WinIOError(Int32 errorCode, String str)
    場所 System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite)
    場所 〇〇.mod_〇〇.fnc_LogDataSend(String& sErrMsg, StatusBar stbMsg)
    場所 〇〇.frm01_Main.ProcUpLoad()
    場所 〇〇.frm01_Main.btnSave_Click(Object sender, EventArgs e)
    場所 System.Windows.Forms.Control.OnClick(EventArgs e)
    場所 System.Windows.Forms.Button.OnClick(EventArgs e)
    場所 System.Windows.Forms.ButtonBase.WnProc(WM wm, Int32 wParam, Int32 lParam)
    場所 System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
    場所 Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain)
    場所 System.Windows.Forms.Application.Run(Form fm)
    場所 〇〇.mod_〇〇.Main()

    ※〇〇はユーザー名が入っているので、隠しますね。

    この内容で何かわかりますでしょうか?


違反を報告
引用返信
■34288 / ResNo.10)  Re[5]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ 魔界の仮面弁士 大御所(1236回)-(2019/07/30(Tue) 11:49:55)
  • アイコン2019/07/30(Tue) 11:50:26 編集(投稿者)

    No34282に返信(オフィス・ケイさんの記事)
    > System.IO.IOException:
    > IOException
    > 場所 System.IO.__Error.WinIOError(Int32 errorCode, String str)
    > 場所 System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite)
    > 場所 〇〇.mod_〇〇.fnc_LogDataSend(String& sErrMsg, StatusBar stbMsg)


    File.InternalCopy が呼ばれるのは、
    System.IO.File の Copy メソッドもしくは
    System.IO.FileInfo の CopyTo メソッドのいずれかですね。

    そして、InternalCopy が直接 __Error.WinIOError を呼び出す箇所は、
    No34274 で言う所の 3 または 13 のいずれかしかなく、
    最終結果が IOException であることから、13 であったと思われます。

    ただ、CopyFile API がどうしてそういう errorCode を吐いたのかは不明のまま…。


    No34275に返信(オフィス・ケエイさんの記事)
    > また、その後はリトライしても同様にIOExceptionで落ちます。
    >  プログラムを一旦終了し、再度起動させるとうまくいきます。

    通信障害などで失敗した時に、それを引きずってしまうのかな…。

    アプリケーションの再起動で回避できるようなので、
    No34276 の最後に書いたように、ファイルコピー用の exe を用意し、
    System.Diagnostics.Process.Start で呼び出す方式でリトライするとか。

    .NET Compact Framework 1.0 では Process クラスが無いけれど、
    .NET Compact Framework 2.0 以降なら使えるはず。
違反を報告
引用返信
■34292 / ResNo.11)  Re[3]: FILE.COPYでIOExceptionエラーが出る
□投稿者/ オフィス・ケイ 一般人(3回)-(2019/08/02(Fri) 08:09:08)
  • アイコンお世話になります。

    file.copyに失敗したとき、
    現状は1回の失敗でエラーを出力して終わっていましたが
    何回かリトライしてそれでもだめだったらエラーを吐き出す。
    ように修正して様子を見てみます。

    回答を頂いた皆様ありがとうございました。

    この件は一旦解決済みとさせていただきます。

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-9] [10-11]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34143 / 親記事)  リストを別フォームに渡す方法
□投稿者/ 包装紙 一般人(1回)-(2019/02/19(Tue) 16:03:33)
  • アイコン環境/言語:[vs 2013 c# .net4.5] 
    分類:[.NET] 

    Form1とForm2があります。Form1からForm2を生成しています。
    
    Form1
    private void Form1_Load(object sender, EventArgs e)
    {
    	textBoxAddress.Text = "";
    	textBoxZipCode.Text = "";
    
    	var f2 = new Form2(this);
    	f2.ShowDialog();
    }
    
    Form2ではテキストボックスが3つあります。テキストボックスにユーザーが値を入力します。
    textBoxName1.Text = "YAMADA";
    textBoxName2.Text = "TARO";
    textBoxSex.Text = "MALE";
    
    var lst = new list<string>();
    lst.Add(textBox1.Text);
    lst.Add(textBox2.Text);
    lst.Add(textBox3.Text);
    
    ここからがやりたい事なのですが、Form2でボタンが押された時、このlstをForm1側に渡したいです。
    
    やりたい事:
    ・Form2のリストをForm1に渡す
    ・Form1でリストを受け取る
    ・SQLを生成。select * from Master where name1 = lst[0] and name2 = lst[1] and sex = lst[2]みたいなSQLを生成して問合せ
    ・必ずデータが見つかるという前提
    ・Form1のtextBoxAddress、textBoxZipCodeにデータベースに問い合わせて見つかった値を入力
    
    といった事がやりたいです。
    
    わからない事:
    ・リストをForm1にわたす方法がわかりません。
    ・form1では受け取った後にSQLを生成して問い合わせるという事をしたいのですが、Form2からリストを受け取ったら発動するようなイベントの作成方法
    
    宜しくおねがいします。

違反を報告
引用返信

▽[全レス9件(ResNo.5-9 表示)]
■34148 / ResNo.5)  Re[3]: リストを別フォームに渡す方法
□投稿者/ 包装紙 一般人(2回)-(2019/02/19(Tue) 17:40:13)
  • アイコンkiku さん
    これだとlstをForm1の方で取得できそうですね。
    ただ、lstをForm2からForm1に渡したタイミングでイベントを
    起こせなかったりします。でも、lstの渡し方の参考になりました。
    ありがとうございます。
違反を報告
引用返信
■34149 / ResNo.6)  Re[4]: リストを別フォームに渡す方法
□投稿者/ 包装紙 一般人(3回)-(2019/02/19(Tue) 17:41:59)
  • アイコンよく考えたら、Form2のリストをForm1に渡さなくても、
    Form2でSQLを実行してForm2で実行結果を取得。
    取得した値をForm1の各テキストボックスに入れてあげた方が
    簡単そうな気がしました・・・
違反を報告
引用返信
■34150 / ResNo.7)  Re[5]: リストを別フォームに渡す方法
□投稿者/ 包装紙 一般人(4回)-(2019/02/19(Tue) 17:43:16)
  • アイコン魔界の仮面弁士さん

    むむむ、私の今の能力では読み解くのに時間がかかりそうです。
    一度ゆっくり紐解きながら読んでいきたいと思います。
    ありがとうございます!
違反を報告
引用返信
■34151 / ResNo.8)  Re[6]: リストを別フォームに渡す方法
□投稿者/ 包装紙 一般人(5回)-(2019/02/19(Tue) 17:46:39)
  • アイコンTextBoxは全て、Form上に配置されているものになります。
違反を報告
引用返信
■34152 / ResNo.9)  Re[7]: リストを別フォームに渡す方法
□投稿者/ 魔界の仮面弁士 大御所(1199回)-(2019/02/20(Wed) 09:26:43)
  • アイコン2019/02/20(Wed) 09:32:12 編集(投稿者)

    No34151に返信(包装紙さんの記事)
    > TextBoxは全て、Form上に配置されているものになります。

    各コントロールを操作するのは、その親フォームが担当するべきなので、
    textBoxAddress や textBoxZipCode の読み書きは Form1 上に記述すべきですし、
    textBoxName1/2 や textBoxSex の操作は Form2 にやらせるべきですね。



    No34143に返信(包装紙さんの記事)
    > Form2でボタンが押された時、このlstをForm1側に渡したいです。
    この「ボタン」というのが、Form2 を閉じるための OK ボタンなのか、
    先の No34146 で示した適用ボタンにあたるのかでも変わってきます。


    ダイアログを閉じた時に List<string> を得られれば良いのであれば、
    Form1 側から MessageBox.Show 感覚で呼べるよう、

     private void button1_Click(object sender, EventArgs e)
     {
      List<string> lst = Form2.ShowUserDialog(this);
      //
      // この後で、lst を使ってデータ検索し、
      // Form1 上にある textBoxAddress / textBoxZipCode に表示する
      //
     }

    と書けるような static メソッドを設けてしまうのも一考かも知れません。
    たとえばこんな感じです。

    public partial class Form2 : Form
    {
     public Form2()
     {
      InitializeComponent();
     }

     public static List<string> ShowUserDialog(IWin32Window owner)
     {
      using (var dlg = new Form2())
      {
       if (dlg.ShowDialog(owner) != DialogResult.OK)
       {
        // 右上 × ボタンで閉じられたら、空の List<> を返す
        return new List<string>();
       }
       else
       {
        // OK ボタンで閉じられたら、ユーザー入力値を返す
        return new List<string>
        {
         dlg.textBoxName1.Text,
         dlg.textBoxName2.Text,
         dlg.textBoxSex.Text,
        };
       }
      }
     }
    }


    上記実装の場合、Form2 上に OK ボタンを設ける必要があります。
    デザイン時に、Form2 上に OK ボタンを貼っておき、
    それの DialogResult プロパティを "OK" にしておいてください。
    (必要に応じて、キャンセルボタンも併設すると良いかも)



    No34149に返信(包装紙さんの記事)
    > Form2でSQLを実行してForm2で実行結果を取得。
    > 取得した値をForm1の各テキストボックスに入れてあげた方が
    > 簡単そうな気がしました・・・

    本質は一緒ですよね。

    データベース操作を Form1 だけに集約させるのか、それとも
    Form2 からもデータベース操作を行わせるかという違いはありますが、
    当初の質問であるデータの受け渡しという本質については変わりません。

    やるべきことは
     『Form2 のダイアログから、呼び出し元の Form1 に情報を返したい』
    という点にあるはず。

    そのときに渡すべき情報が
     ・Address 文字列
     ・ZipCode 文字列
    という「検索結果」に変わっただけでなので、最初の質問の
     ・textBox に入力された Name1 文字列
     ・textBox に入力された Name2 文字列
     ・textBox に入力された Sex 文字列
    という「ユーザー入力値な List<string>」を返す場合と同じ手順が使えるでしょう。


    今までに提案してきた『データの渡し方』としては、以下の物があります。

    ・Form2 の静的メソッドの戻り値として返すパターン(本投稿の ShowUserDialog メソッド)
    ・Form2 のインスタンスプロパティとして返すパターン( No34146 の CurrentList プロパティ)
    ・Form2 のイベント引数で返すパターン( No34144 の案1)
    ・コールバック用のデリゲートを Form1 側から Form2 に渡しておくパターン( No34144 の案2)
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-9]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34133 / 親記事)  例外発生した場合に変数をcatchに渡したい
□投稿者/ ssd 一般人(1回)-(2019/02/15(Fri) 10:55:29)
  • アイコン環境/言語:[c# .net4.5] 
    分類:[.NET] 

    DataTable dt = new DataTable();
    try
    {
    foreach (DataRow dr in dt.Rows)
    {
    int iHogeOld = (int)dr["HOGE"];
    }
    }catch(Exception e)
    {
    //ここでdr["HOGE"]の値を表示したい
    }

    foreach内で型変換に失敗した場合、catch側で何が失敗したのか知りたいです。
    この場合、catchの方に変数の値を渡したいのですが、どうすればいいでしょうか?
違反を報告
引用返信

▽[全レス9件(ResNo.5-9 表示)]
■34138 / ResNo.5)  Re[1]: 例外発生した場合に変数をcatchに渡したい
□投稿者/ 魔界の仮面弁士 大御所(1196回)-(2019/02/15(Fri) 17:51:45)
  • アイコン2019/02/15(Fri) 18:59:22 編集(投稿者)

    No34133に返信(ssdさんの記事)
    > DataTable dt = new DataTable();
    > try
    > {
    >  foreach (DataRow dr in dt.Rows)
    >  {

    行数が 0 なのでそもそもループ処理に入らないですが、
    それは本題ではないので置いといて…。



    > catch(Exception e)

    そもそも論で言えば、すべての例外を無条件に拾うことは望ましくありません。

    実行時例外で処理するしかない処理(通信エラー等)以外は捕らえるべきではないので、
    「int に変換できないような値が DataTable に混入しないようにする」か、
    「int に変換できる場合にのみキャストする」などして、
    例外を発生しないコードに書き換えることも検討してみてください。


    例外処理のための参考資料を紹介しておきます。
    https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/
    https://blogs.msdn.microsoft.com/nakama/2009/01/02/net-part-2/
    https://blogs.msdn.microsoft.com/nakama/2009/01/18/net-part-3/
    https://blogs.msdn.microsoft.com/nakama/2009/01/23/net-part-4/
    https://blogs.msdn.microsoft.com/nakama/2009/01/08/netjava/


    >   int iHogeOld = (int)dr["HOGE"];

    ということで、例外が発生しないようにする方法の一つとして、
     // int 以外は(DBNull など)は -999 として取り扱う
     int intHoge = dr["HOGE"] as int? ?? -9999;
    のようにするという手もあろうかと思います。



    > foreach内で型変換に失敗した場合、catch側で何が失敗したのか知りたいです。

    何らかの理由で、catch で捕らえる必要があるのだとしても、
    例外処理として「型変換」のみを取り扱いたいのであれば、
    【Exception】ではなく【InvalidCastException】を捕らえるべきかと思います。


    foreach (DataRow dr in dt.Rows)
    {
     // object[] rawData = dr.ItemArray; // 全部の列の値をまとめて取得
     object rawHoge = dr["HOGE"]; // 特定の列の値のみ取得
     try
     {
      int iHoge = (int)rawHoge; // int 型に unbox
     }
     catch (InvalidCastException)
     {
      Console.WriteLine("HOGE 列の値「{0}」を int に変換できませんでした。(型名:{1})", rawHoge, rawHoge.GetType().FullName);
      // throw;
     }
    }



    >   int iHogeOld = (int)dr["HOGE"];

    実際の値が DBNull や long であった場合、上記の処理は確かに失敗しますが、
    ここで発生しうる例外は、unbox の失敗によるものだけではないはずです。


    たとえば列名が間違っていれば、引数例外の【ArgumentException】が起きることもありますし、
    削除済み行にアクセスしようとして【DeletedRowInaccessibleException】となることもあるわけで。
違反を報告
引用返信
■34139 / ResNo.6)  Re[2]: 例外発生した場合に変数をcatchに渡したい
□投稿者/ ssd 一般人(3回)-(2019/02/15(Fri) 18:04:37)
  • アイコン
    まりもんさん
    
    catch(Exception e)
     {
      //ここで出力
        Console.WriteLine(dr["HOGE"]);
        Throw;
    }
    
    の箇所でConsole.WriteLine(dr["HOGE"]);は出力できないような気がします。
    試してみましたがはやり駄目でした。
    
    ご回答ありがとうございます。

違反を報告
引用返信
■34140 / ResNo.7)  Re[2]: 例外発生した場合に変数をcatchに渡したい
□投稿者/ ssd 一般人(4回)-(2019/02/15(Fri) 18:06:47)
  • アイコンひできちさん

    foreachではなく、forでやるのですか。
    なるほど、なるほど。何か良い気がします。ありがとうございます。
違反を報告
引用返信
■34141 / ResNo.8)  Re[3]: 例外発生した場合に変数をcatchに渡したい
□投稿者/ タイガー 一般人(1回)-(2019/02/18(Mon) 14:40:25)
  • アイコン
    > catch(Exception e)
    > {
    >   //ここで出力
    > Console.WriteLine(dr["HOGE"]);
    > Throw;
    > }
    >
    > の箇所でConsole.WriteLine(dr["HOGE"]);は出力できないような気がします。
    > 試してみましたがはやり駄目でした。

    もりまんさんのコードはtry〜catchの2段重ねで、上記は内側のcatchのため、dr["HOGE"]は表示できますよ。

違反を報告
引用返信
■34142 / ResNo.9)  Re[3]: 例外発生した場合に変数をcatchに渡したい
□投稿者/ ssd 一般人(5回)-(2019/02/19(Tue) 09:39:13)
  • アイコンみなさま、ありがとうございます。

    例外に対する考えが甘かったです。反省。

    もりまんさん。申し訳なかったです、実行できました。

    ありがとうございました!
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-9]



■記事リスト / ▲上のスレッド
■34243 / 親記事)  Code128でバーコードが読み取れない
□投稿者/ ぴょん 一般人(8回)-(2019/04/30(Tue) 12:59:08)
  • アイコン環境/言語:[VB.NET] 
    分類:[.NET] 

    2019/04/30(Tue) 14:07:30 編集(投稿者)
    2019/04/30(Tue) 14:06:30 編集(投稿者)
    2019/04/30(Tue) 14:05:47 編集(投稿者)
    2019/04/30(Tue) 14:05:30 編集(投稿者)
    
    Zxing.NetのCode128でバーコードを作成し、
    ハンディターミナルで読み取りをしています。
    4桁や15桁のバーコードはすぐに値を検知するのですが、
    40桁のバーコードはなかなか検知してくれません。
    以下、ソースを書きました。
    何か問題点があれば、ご教示願います。
    
    
    --------------------------------------------------------------------------
    Dim img As New Bitmap(2200, 1000, Imaging.PixelFormat.Format24bppRgb)
    
    Using g = Graphics.FromImage(img)
    
      Dim writer As New ZXing.BarcodeWriter
    
      'バーコードの種類
      writer.Format = ZXing.BarcodeFormat.CODE_128
    
      'マージン
      writer.Options.Margin = 1
    
      '文字コード
      writer.Options.Hints(ZXing.EncodeHintType.CHARACTER_SET) = "Shift_JIS"
        
      writer.Options.PureBarcode = blnPureBarcode
    
      'エラー訂正レベル
      writer.Options.Hints(ZXing.EncodeHintType.ERROR_CORRECTION) =
                                  ZXing.QrCode.Internal.ErrorCorrectionLevel.L
    
      '作成
      dim btmp as Bitmap = 
                  writer.Write("1234567890ABCDEFGHIJ1234567890ABCDEFGHIJ")
    
      g.DrawImage(btmp, 1080, 560, 310, 110)
    End Using
    --------------------------------------------------------------------------
    
    
    又、作成したバーコードも添付します。
    幅を広げれば少しは読み取れるようになるのですが、
    幅は変えずにバーコードの太さを変える方法等あれば。
    

415×59 => 250×35
イメージ
1556596748.png
/3KB
違反を報告
引用返信

▽[全レス8件(ResNo.4-8 表示)]
■34248 / ResNo.4)  Re[4]: Code128でバーコードが読み取れない
□投稿者/ ぴょん 一般人(9回)-(2019/04/30(Tue) 23:39:39)
  • アイコンご回答ありがとうございます。
    説明不足で申し訳ありません。

    > 汎用的なプログラムを作っているのか、自分専用のプログラムを
    > 作っているのか、どちらなのでしょうか?

    客先に納品予定で、RFIDタグにバーコードを出力する
    プログラムを作成しています。
    旧システムから出力されるバーコードもcode128を使用していた為、
    ほぼ同じ幅・長さで40桁のバーコードを作成したところ、
    ハンディでなかなか読み取れませんでした。
    (旧システムはすぐに読み取れる事ができて、線も太いです)

    そこで幅や長さを度外視して、まずは確実にハンディで読み取れるように
    手探りで設定を変更していました。



違反を報告
引用返信
■34250 / ResNo.5)  Re[5]: Code128でバーコードが読み取れない
□投稿者/ Azulean 大御所(510回)-(2019/05/01(Wed) 00:42:22)
  • アイコンNo34248に返信(ぴょんさんの記事)
    > 客先に納品予定で、RFIDタグにバーコードを出力する
    > プログラムを作成しています。

    RFID タグにバーコードを出力する…という表現では具体像が見えづらいのですが、シールプリンターか何かですか?
    それとも普通のインクジェットプリンターで専用のシール台紙に印刷しているのですか?

    印刷であれば、プリンターの解像度、印刷するための処理の作り方に左右されると思います。(今掲載されていないコードの範囲も影響しうる)

    > そこで幅や長さを度外視して、まずは確実にハンディで読み取れるように
    > 手探りで設定を変更していました。

    Bitmap や DrawImage あたりを触るだけでは解決市内可能性もあります。
    自分が扱っている画像の解像度(DPI)は何で、プリンターなどの出力に流す際にその DPI(解像度)はどうなるのかをきちんと把握して、元画像のあるべき姿を決めにかからないといけないと思われます。
違反を報告
引用返信
■34251 / ResNo.6)  Re[6]: Code128でバーコードが読み取れない
□投稿者/ ぴょん 一般人(10回)-(2019/05/01(Wed) 10:09:01)
  • アイコン2019/05/01(Wed) 10:21:06 編集(投稿者)
    2019/05/01(Wed) 10:17:02 編集(投稿者)
    2019/05/01(Wed) 10:10:48 編集(投稿者)

    ご回答ありがとうございます。
    ソースに問題があると思い込んでいました。

    > シールプリンターか何かですか?
    > それとも普通のインクジェットプリンターで専用のシール台紙に
    > 印刷しているのですか?

    リコーのRFID出力プリンタに、バーコードを出力しています。

    https://industry.ricoh.com/rfid/printer/prkl.html

    印刷する用紙は、以下のRFIDタグを使用しています。

    https://industry.ricoh.com/rfid/recoview/about/


    バーコード等のデザインを印刷する場合、
    [34243]でコーディングしたbmpを8ビットのグレースケールにし、
    バイト配列に変換したデータを、
    プリンタ側に渡す仕様になっていました。





違反を報告
引用返信
■34252 / ResNo.7)  Re[7]: Code128でバーコードが読み取れない
□投稿者/ Azulean 大御所(511回)-(2019/05/02(Thu) 09:16:34)
  • アイコン2019/05/02(Thu) 09:22:40 編集(投稿者)

    No34251に返信(ぴょんさんの記事)
    > ソースに問題があると思い込んでいました。

    ソースコードの問題である可能性は、否定できません。
    ただし、今抜粋されている範囲内に問題があるかどうかはわかりません。

    添付されている画像を見る限り、縮小時に補間がかかっていて、中間色が出ているようなので、これは読み取りに影響を与えると思われます。
    Graphics.InterpolationMode へ NearestNeighbor を指定すればマシになるかどうか。

    また、BarcodeWriter には Options があるらしいので、そこでサイズを指定する方法に切り換えるという道もあるかもしれません。(後から縮小するよりもまっとうなやり方だと思います)
    参考:https://office-fun.com/tech-memo-zxingnet-1d-barcode/


    > リコーのRFID出力プリンタに、バーコードを出力しています。

    ニッチな用途なので、これに特有の問題であれば、第三者には助言できないと思います。
    基本的には質問者さんの自助努力で頑張るしかないです…。
違反を報告
引用返信
■34255 / ResNo.8)  Re[8]: Code128でバーコードが読み取れない
□投稿者/ ぴょん 一般人(11回)-(2019/05/07(Tue) 11:02:53)
  • アイコンご回答ありがとうございます。
    返信が遅くなり、申し訳ありません。

    > Graphics.InterpolationMode へ NearestNeighbor を指定すれば
    > マシになるかどうか。
    InterpolationModeプロパティをいろいろ試したところ、
    高品質双三次補間がハンディで一番検知しやすかったです。

    Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic


    > また、BarcodeWriter には Options があるらしいので、
    > そこでサイズを指定する方法に切り換えるという道もあるかもしれません。
    サイズ指定も以下に修正しましので、
    作業を進めていきたいと思います。

    --------------------------------------------------------------------------
    'サイズ指定
    writer.Options.Width = 310 '幅
    writer.Options.Heigth = 110 '高さ

    '作成
    dim btmp as Bitmap =
    writer.Write("1234567890ABCDEFGHIJ1234567890ABCDEFGHIJ")

    g.DrawImage(btmp, 1080, 560)
    ''g.DrawImage(btmp, 1080, 560, 310, 110)
    --------------------------------------------------------------------------

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-8]






Mode/  Pass/


- Child Tree -