質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

1390閲覧

C# USB検索ソースのエラー修正

keion327

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/11/09 04:37

C#を使い始めてまだ1か月も経たない初心者です。

C++で開発されたDLLを読みこみ、USBポートの検索ソースを、C#に変換しなくてはなりません。

windows10でVisual Studio 2017を使用しています。

自分でやってみたところ、いくつかエラーを吐いてしまいエラー内容を見てもそれがどう修正したら良いか分かりません。

teratailもまだ利用したばかりで質問の仕方などが分かっておりませんので、それらについてもご教授ください。

質問内容などがおかしかったら申し訳ありません。

エラー↓
①if (!DbHandler.USBControl_Selection(p_port , ref total))

この引数であるp_port箇所でエラーが出ます。エラー内容は、"ref char[]へ変換することができません"という内容でした。char型の配列の構造体を引数として渡すやり方をご教授ください。

②char portOut = usbFindArg(ref (string)GetCommandLine());
int portNum;

if (StringFunctions.StrStr(portOut, "USB") != null) { for (int i = 0; i < 4; i++) { if (StringFunctions.StrStr(p_port[i].cUSBPortName, portOut)) { p_port[0].cPrinterName = p_port[i].cPrinterName; p_port[0].cUSBPortName = portOut; portNum = i; break; } if (i == 3) { p_port[0].cPrinterName = ""; p_port[0].cUSBPortName = ""; portNum = -1; } } }

これは、GetCommandLine();で"GetCommandLineという名前は存在しません"と出ます。
また、if (StringFunctions.StrStr(p_port[i].cUSBPortName, portOut))でも"StringFunctionsは存在しません"と出ます。p_port[i]では、"角かっこ[]付きインデックスを、Form3.USBPortTag型の式に適用することはできません"と出ます。

USB検索全体のソースです↓

C#

1public partial class Form3 : Form 2 { 3 public static char[] cUSBPortName = new char[128]; 4 public static char[] cPrinterName = new char[128]; 5 6 public class USBPortTag 7 { 8 9 public string cUSBPortName = new string(new char[128]); //USBポート名 10 public string cPrinterName = new string(new char[128]); //プリンター名 11 } 12 13 14 15 16 public Form3() 17 { 18 InitializeComponent(); 19 } 20 21 22 23 private bool RetryWaitFlg = false; 24 private USBPortTag PortUsb = new USBPortTag(); 25 private string PrnPortNumber; 26 int MAX_PATH = 128; 27 private string MB_OKCANCEL; 28 29 30 public bool ConnectUsb(string portName) 31 { 32 33 34 35 USBPortTag p_port; 36 int total = 0; 37 38 PortUsb.cUSBPortName = " USB000"; 39 40 p_port = PortUsb; 41 42 // USB検索 43 if (!DbHandler.USBControl_Selection(p_port , ref total)) 44 { 45 MessageBox.Show("Failed to find USB-Printer ! \n", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); 46 return false; 47 } 48 49 50 51 char portOut = usbFindArg(ref (string)GetCommandLine()); 52 int portNum; 53 54 if (StringFunctions.StrStr(portOut, "USB") != null) 55 { 56 for (int i = 0; i < 4; i++) 57 { 58 if (StringFunctions.StrStr(p_port[i].cUSBPortName, portOut)) 59 { 60 p_port[0].cPrinterName = p_port[i].cPrinterName; 61 p_port[0].cUSBPortName = portOut; 62 portNum = i; 63 break; 64 } 65 if (i == 3) 66 { 67 p_port[0].cPrinterName = ""; 68 p_port[0].cUSBPortName = ""; 69 portNum = -1; 70 } 71 } 72 } 73 else 74 { 75 76 portNum = 0; 77 } 78 79 PrnPortNumber = portName = p_port[portNum].cUSBPortName; 80 81 // USB接続 82 if (!DbHandler.USBControl_Connection(p_port)) 83 { 84 MessageBox.Show("Failed to find USB-Printer ! \n", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); 85 return false; 86 } 87 88 return true; 89 } 90 91

DLLのソースです↓

C#

1public static char[] cUSBPortName = new char[128]; 2 public static char[] cPrinterName = new char[128]; 3 4 public struct USBPortTag 5 { 6 public char cUSBPortName; //USBポート名 7 public char cPrinterName; //プリンター名 8 9 }; 10 11 USBPortTag USBSelection; 12 13 //SfProTime[ProTimecnt].SfTimer = SFEndTime; 14 15 //接続情報取得 16 [DllImport("USB_TCPIP_DLL.dll", EntryPoint = "USBControl_Selection", CallingConvention = CallingConvention.Cdecl)] 17 public static extern bool USBControl_Selection(ref char[] USBSelection, ref int PortTotal); 18 19 //接続 20 [DllImport("USB_TCPIP_DLL.dll", EntryPoint = "USBControl_Connection", CallingConvention = CallingConvention.Cdecl)] 21 public static extern bool USBControl_Connection(ref char[] USBSelection); 22} 23

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/11/09 05:41

解決する気ありますか? あるなら相談に乗りますが、あなたでなければできないことはあなたがしなければなりませんし、情報が足りないので色々質問に答える必要があります。
keion327

2018/11/09 06:15

解決したいです。質問をお願いします。
Zuishin

2018/11/09 06:16

まず前の質問を戻し、そこの質問に答え、それを考慮してこの質問を編集し、コードブロックを使ってください。
Zuishin

2018/11/09 06:17

戻すというのは、削除されたコードなどを戻すという意味です。
guest

回答1

0

ref char[] は C++ で wchar** 扱いですが、意図したものになってますか?
わざわざ char 配列にしなくても、 string 型に MarshalAs 属性を使えばいいはずです。
文字列に対する既定のマーシャリング

投稿2018/11/12 11:32

gaya-K

総合スコア449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問