最近勉強していて仮想シリアルポートを実装するC#プログラムを作ろうと思ったのですが、ドライバの書き方が分からないので兄のやり方に従い、VSPDのDLLオープンインターフェースを呼び出して実装しました。
初めての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)
(メッセージ 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 ブログ