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