VSPD DLLを呼び出すことで二次開発の異常を解決します。

最近勉強していて仮想シリアルポートを実装するC#プログラムを作ろうと思ったのですが、ドライバの書き方が分からないので兄のやり方に従い、VSPDのDLLオープンインターフェースを呼び出して実装しました

VSPD 仮想 COM ポート インストール パッケージから独立したドライバー インストール パッケージを抽出します (仮想シリアル ポートの開発と EXE プログラムの解凍) http://blog.csdn.net/xxdddail/article/details/17163035

初めてのDLL呼び出しだったので色々エラーが出たのでここで共有します。

まず、VSPD dll を直接参照することはできません。

そうしないと、次のエラー メッセージが表示されます。

正しい方法は、DLL をプログラム フォルダー内の Debug フォルダーに置き、exe ファイルと一緒に置くことです。次に、プログラムを右クリックして再生成します。

 次に、VSPD ユーザー マニュアルと対応するインターフェイス (「プログラムでのシリアル ポート ドライバーの使用」の「関数」を参照) を参照し、C# で対応する呼び出しを作成します。コードは次のとおりです。(ここでは、シリアル ポートを作成する呼び出しのデモを示します。)

[DllImport("vspdctl.dll")]//引用DLL
        public static extern bool CreatePair(string comName1, string comName2);

次に、このメソッドを呼び出します。今回はフォームを書いているので、ボタンにメソッドを書きます。

using static CreatePortDemo.VSPDClass;//注意引用你写接口的类

private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                bool IsCrateSeccuss = CreatePair(CreatePortName.Text, CreatePortName2.Text);;//因为接口返回是一个bool值,用一个bool值存储起来是否创建成功
                if (IsCrateSeccuss)
                {
                    MessageBox.Show("创建成功");
                }
                else
                {
                    MessageBox.Show("失败");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            
            
            
        }

その後デバッグすると、次の問題が発生する可能性があります。

または、長時間応答せず、最終的にエラーは報告されませんが、クラッシュして終了し、出力リストにAccessViolationExceptionが表示されます。

これはどのような異常ですか? トライキャッチでも釣れなかったので最初は分かりませんでしたが、後で調べてみました。

AccessViolationException: 保護されたメモリに対して読み取りまたは書き込みを試行しました。これは通常、他のメモリが破損していることを示します

そこで、DLL が間違っているのではないかと思い始めました。そこで、オンラインにアクセスして VSPD DLL を再度ダウンロードし、自分の DLL と比較しました。うーん...新しいダウンロードは 3000 kb を超えていますが、私のダウンロードは 100 kb を超えています

私の DLL が壊れていて、もう実行できないのでしょうそこで、DLL を変更して再度テストしたところ、エラーは報告されませんでした

しかし、エラーがないからといって、問題が解決されたわけではありません

[DllImport("vspdctl.dll")]//引用DLL
        public static extern bool CreatePair(string comName1, string comName2);

 この関数を使用して仮想シリアル ポートを作成しました。作成が成功した場合は true を返し、失敗した場合は false を返します。

if else を使用して簡単なプロンプトを作成しました。true を受け取った場合は「成功」をプロンプトし、それ以外の場合は「失敗」をプロンプトします。

その結果、テスト中はtrue が返され続けましたが、シリアル ポートはまったく作成されませんでした

 この状況は、いたずらっ子に宿題を頼んで、終わったら「終わったよ」って言うのに、何も書かずに「終わったよ」と言われるようなものです悲しくて怒りを感じたので、昼寝することにしました。

午後に目が覚めたとき、コンピュータの VSPD が新しくダウンロードした DLL のバージョンと一致していないことに突然気づきました。

そこで、同じバージョンの VSPD をすぐにダウンロードしてインストールしました。結果として、テストは成功しました

 百度で私と同じ境遇の人が見つからないのも不思議ではありません。気絶!

解決策: DLL と一致する VSPD をダウンロードします。インターフェイス機能を正常に使用するには、DLL がコンピュータの VSPD バージョンと一致する必要があります。

 参考資料(私の悲しい旅も):

AccessViolationException など、C# がキャッチできない例外 - A Lone Ape - Blog Garden (cnblogs.com)

(メッセージ 1 件) C#: AccessViolationException: 保護されたメモリへの読み取りまたは書き込みを試行しました。これは通常、他のメモリが破損していることを示します。ソリューション コレクション_Debris Ball のブログ-CSDN ブログ

(メッセージ数 2 件) VSPD 仮想 COM ポート インストール パッケージからの独立したドライバー インストール パッケージの抽出 (仮想シリアル ポートの開発と EXE プログラムの解凍)_随時学習_CSDN ブログ

(メッセージ 2 件) C# でサードパーティ DLL の呼び出しに失敗する_BIGE_BIGGER のブログ - CSDN ブログ

C# が C++dll を呼び出し、エラーを報告する ACCESS VIOLATION-CSDN Community

(メッセージ 2 件) c#_Ink Direct ブログ-CSDN Blog_C# でインターフェイスを呼び出す 2 つの方法

(メッセージ 2 件) C#_yaked19 のブログでの DLL の呼び出し - CSDN Blog_C# DLL の呼び出し

(メッセージ 2 件) C# が C++ DLL を呼び出し、PInvoke の問題とコールバック関数が例外アクセス違反をスローする_Zhiyuanfang-風と雨のブログ-CSDN ブログ

(メッセージ 2 件) サードパーティの DLL を呼び出すときにクラッシュする理由と解決策_Brown Lihuamao のブログ - CSDN ブログ

おすすめ

転載: blog.csdn.net/aa989111337/article/details/126033160