C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■2311  Re[5]: TableAdapter拡張をVB.NETと同じにするには?
□投稿者/ 刈歩 菜良 -(2007/03/31(Sat) 12:45:10)
>
    > コンストラクタ内で書けばとの事ですが、TableAdapterのコンストラクタは
    > ウィザードがDataSetのDesigner.csの中で既に記述されています。
    > パーシャルクラスで当然コンストラクタを再度定義すれば、コンパイルエラーとなります。
    今のところ直に書くしかないと思います。
    イベントも持ってないですしね(Disposeを除く)。

    # OrcasからはPartial Methodとやらでできるようになるのかなぁ(勝手な思い込み)?
記事No.2200 のレス /過去ログ11より / 関連記事表示
削除チェック/

■61718  Re[1]: データベースの参照がうまくできません
□投稿者/ 魔界の仮面弁士 -(2011/08/31(Wed) 10:12:08)
    No61714 (trf さん) に返信
    > 削除を行った後に追加を行うと、「削除された行を通して、その行の情報にアクセスすることはできません。」というエラーが出ます。

    Table_1.Rows.Remove(…)
    Table_1.Rows(…).Delete()
    の違いは分かりますか?

    前者は、行そのものを Rows から取り除きますが
    後者は、行に削除マークを付けるだけで、Rows 内からは取り除かれません。


    DataGridView から削除した場合、DataTable の行も削除されますが、
    これは DataTable から取り除かれるのではなく、
    削除済み行としてマーキングされるだけです。


    DataTable の各行には、RowState プロパティと呼ばれる状態情報を有しており、
     Deleted …… 削除された行
     Added …… 追加された行
     Modified …… 変更された行
     Unchanged …… 変更されていない行
    のいずれかの状態になっています。
    (上記の他、DataTable 上にない行を表す 'Detached' があります)

    削除された行も DataTable には存在していますが、削除済み行からは
    現在の値を読み書きする事ができないのです。


    ちなみに、Deleted な行であっても、
     Table_1.Rows(i)(列, DataRowVersion.Original)
    のようにすると、削除前の値を読み取ることができます。
    (Added 行の場合は Original 値がありません。Deleted 行の場合は Current 値がありません。)


    > cal_total = cal_total + Table.Rows(j)(2) '←ここでエラーが出力されます
    対処方法としては
     (案1) 削除処理後に AcceptChanges メソッドを呼び出して、編集結果を
      確定させておく。(Deleted 行は取り除かれ、Added や Modifiedは Unchanged になる)
     (案2) DataGridView から削除するのではなく、元となっている DataTable 上から
      取り除くようにする。
     (案3) DataView を利用して、削除されていない行のみをフィルタリングして読み取る。
     (案4) 列の値にアクセスする前に、RowState プロパティを確認して
      削除された行であったら読み飛ばすようにする。
    などといった対処が考えられます。
記事No.61714 のレス /過去ログ103より / 関連記事表示
削除チェック/

■75312  Re[3]: VB.netからVC++6.0のへの構造体配列参照渡し
□投稿者/ 魔界の仮面弁士 -(2015/03/13(Fri) 09:36:15)
    No75308 (とら さん) に返信
    >>>呼出し後に参照で渡した(oStructure1)の数が1つになっている
    >>「(oStructure1)の数」というのは、どうやって確認した物ですか?
    > VC++6.0をデバッグ実行し確認しました。

    VB EXE 側ではなく、VC++ DLL 側のデバッガで要素数を確認されたのでしょうか。

    今回の配列って、VB 側でメモリ確保されたものですよね。

    配列要素の先頭要素をアドレス渡ししているのだとしたら、
    C++ 側では要素数は分からないように思うのですが、違うのかな。


    もし、引数が C スタイルの配列ではなく、COM の SAFEARRAY で宣言されていたなら
    C++ 側で要素数を確認することもできるでしょうけれども、その場合、VB6 では
    「Type ステートメントで型定義されたユーザー定義型」の配列ではなく、
    「タイプライブラリにて型定義された構造体」の配列になっていたはず。

    でも、実際にはそうでは無かったのですよね…?
記事No.75306 のレス /過去ログ127より / 関連記事表示
削除チェック/

■75314  Re[4]: VB.netからVC++6.0のへの構造体配列参照渡し
□投稿者/ とら -(2015/03/13(Fri) 11:28:42)
    No75312 (魔界の仮面弁士 さん) に返信

    お手数をお掛けして申し訳御座いません。
    再度徹底して見直してまとめなおしました。


    >VB EXE 側ではなく、VC++ DLL 側のデバッガで要素数を確認されたのでしょうか。
    VB2008側及びVC++側のデバッグ双方にて確認致しました。
    VCで受け取った際に既に要素数が1個になっていたようなのでVB2008側での問題だと思いました。



    VC++6.0側は内容が理解できなかったのでメソッドの宣言部のみです

    VC++6.0側のType1に関しては、「受信データを格納する構造体へのポインタ
    または受信データを格納した共有メモリの管理構造体へのポインタ」
    と記載がありました


    ## VC++6.0 ###########

    Test1_API int __stdcall Test1(LPSAFEARRAY *Type1)


    ## VB6.0 #############

    -- 宣言部 ----

    Declare Function Test1 Lib "TestFunc.DLL" (oType() As Any) As Long

    Public Type Type1
    Long1 As Long
    Long2 As Long
    Long3 As Long
    End Type

    Public oType(0 To 9) As Type1


    -- 処理 ----

    Dim iRet As Long
    iRet = Test1(oType())



    ## VB2008 アップグレード後にエラー及び警告を排除した状態で渡されたソース #############

    -- 宣言部 ----

    Declare Function Test1 Lib "TestFunc.DLL" (ByRef oStructure() As Structure1) As Integer

    Public Structure Structure1
    Dim int1 As Integer
    Dim int2 As Integer
    Dim int3 As Integer
    End Structure

    Public oStructure1(9) As Structure1


    -- 処理 ----

    Dim iRet As integer = -1
    iRet = Test1(oStructure1)

    '結果としては配列の要素数が1個になっており、値も変更されていない



    ## VB2008 ご指摘部分反映後 #############


    '参照渡しを値渡しに変更しマーシャリングを追加

    Imports System.Runtime.InteropServices

    Declare Function Test1 Lib "TestFunc.DLL" (<InAttribute(), OutAttribute()> ByVal oStructure() As Structure1) As Integer

    '結果としては配列の要素数は10個になったものの値は変更されていない



    以上、引き続きお願い致します。
記事No.75306 のレス /過去ログ127より / 関連記事表示
削除チェック/

■75336  Re[4]: VB.netからVC++6.0のへの構造体配列参照渡し
□投稿者/ 魔界の仮面弁士 -(2015/03/16(Mon) 19:34:59)
    2015/03/17(Tue) 10:06:34 編集(投稿者)

    No75312 (魔界の仮面弁士) に追記
    > もし、引数が C スタイルの配列ではなく、COM の SAFEARRAY で宣言されていたなら
    > C++ 側で要素数を確認することもできるでしょうけれども、その場合、VB6 では
    > 「Type ステートメントで型定義されたユーザー定義型」の配列ではなく、
    > 「タイプライブラリにて型定義された構造体」の配列になっていたはず。

    駄目元で、型定義を公開してみました。
    P/Invoke の際に必要な手続きなのかどうかは分かりませんけど。
    (COM Interop だった場合は、型公開が必要なはず…?)


    (1) AssemblyInfo.vb にて、
       <Assembly: ComVisible(True)>
       <Assembly: Guid("……")>
      を指定しておきます。プロジェクトのプロパティの[アプリケーション]-[アセンブリ情報]でも指定可。

    (2) 構造体側にも、また別の GUID を割り当てておきます。

      <ComVisible(True), Guid("……"), StructLayout(LayoutKind.Sequential)> _
      Public Structure Structure1
        <MarshalAs(UnmanagedType.I4)> Public aaa As Integer
        <MarshalAs(UnmanagedType.I4)> Public bbb As Integer
        <MarshalAs(UnmanagedType.I4)> Public ccc As Integer
      End Structure


    実際の Guid 属性には、 Visual Studio 付属の GUIDGEN.EXE もしくは
    「TextBox.Text = Guid.NewGuid().ToString("D")」などで生成した値を指定します。


    (3) スタートメニューの "Visual Studio コマンドプロンプト" を右クリックして管理者起動し、
     「RegAsm C:\YourFolder\YourAppName.EXE」を実行します。(実際のパスにあわせてください)

     『型は正常に登録されました。』などのメッセージがされれば登録完了。

    この段階で、レジストリの
     HKEY_CLASSES_ROOT\Record\{構造体のGuid}\バージョン番号\
    に、構造体が記録されるはず。


    ---------

    上記を実施したうえで、SafeArraySubType を変更してみたり、
    Object 型でしてみたりと試行錯誤していたところ、

    ・配列が 1 件になることもなく呼び出せたものの、
     DLL 側での編集結果が反映されないケース(中身が呼び出し時のまま)。

    に至りました。好転したかと思いきや、同じコードのまま
     AccessViolationException「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」
    が発生することもあったので、恐らくは誤った呼び出し方のようです。…難しいですね。

    他のパターンとしては、
     SafeArrayTypeMismatchException「指定された配列は期待されたタイプではありません。」
    で呼び出せなかったり、呼び出せても配列が 1 件になってしまう状況だったりしており、
    解決までの道のりは長そうです。


    ただ、以前と同じ Declare 宣言でも、構造体定義を RegAsm するかどうかで
    エラーの内容が変わる組み合わせがあったので、公開すること自体は
    まったくの無意味では無さそうに思います。(確証は持てませんが)


    No75332 (とら さん) に返信
    > 引き続き他の方々もご存知の方がおられましたらご回答頂ければ助かります。

    SAFEARRAY** や LPSAFEARRAY* での構造体受け渡しに関する質問は
    ネット上でも度々見かけますが、成功事例がなかなか見当たりません。

    セーフ配列を使わず、配列先頭ポインタと配列長を渡す実装に変更して回避するケース、
    質問を取り下げて諦めるケース、中継用のヘルパーライブラリを用意して回避したケース、
    VB/C# 側でSAFEARRAY 相当のメモリ構造を組み上げてそれを IntPtr で渡すケース、
    カスタムマーシャラを作るケースなどなど…。


    そんな中、こんな記事を見つけました。参考になりますか?

    "Marshaling a SAFEARRAY of Managed Structures by P/Invoke"
    https://limbioliong.wordpress.com/category/netcomactivex-interop/safearrays/

    私自身まだ読みきっていませんが、標題から推察するに、今回の案件に相当する話題かと。
記事No.75306 のレス /過去ログ127より / 関連記事表示
削除チェック/

■97859  Re[4]: csvデータの1行目を削除したデータを作成する
□投稿者/ 774RR -(2021/07/29(Thu) 13:00:09)
    CSV ってことはフツーにテキストファイルのはずなので、やるべきことは1行読み飛ばすだけ
    ならば自作するまでもなくて cygwin/WSL2 の head とか tail とか awk とか使うだけっス。
    シェルスクリプトワンライナーで実装できる
    $ rm -f cat.csv; for i in *.csv; do tail -n +2 $i >> cat.csv; done

    powershell でもできそうな気がするし、自分で作っても System.IO.StreamReader / StreamWriter 使うだけ。

    1行読むのにギガバイト読む必要はないので、除去だけなら一瞬だし
    結合してギガバイトになったのなら遅いのはしょうがないし
    何を悩んでいるのか微妙にわからん・・・
記事No.97854 のレス /過去ログ170より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -