※ ChatGPTを利用し、要約された質問です(原文:VB2010でPC-OP-RS1を読み出すとエラー)
VB2010でPC-OP-RS1を読み出すとエラー
2011/07/22 08:56
このQ&Aのポイント
VB2010からPC-OP-RS1を読み出す際にエラーが発生
PC-OP-RS1をカスタム利用するDLLをVB2010で使用しようとしているが、宣言での引数指定がうまくいかずエラーが出ている
DLLのソースでは引数の指定はint型で行われており、VB2010での宣言方法が間違っている可能性がある
VB2010でPC-OP-RS1を読み出すとエラー
PC-OP-RS1をカスタム利用するDLL、pc-op-rs1-control.dllをVB2010から利用しようとしています。
PC-OP-RS1 - PukiWiki
http://1c3.world.coocan.jp/wiki/index.php?%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%EBDLL%A4%F2%BA%EE%A4%ED%A4%A6
しかし、宣言での引数の指定の仕方が悪いらしく、エラーが出てしまいます。
こちらも参考にしてみました。
http://okwave.jp/qa/q4511807.html
このDLLをモジュールで以下のように宣言をして読み出しています。
Public Declare Function remo_close Lib "pc-op-rs1-control.dll" _
Alias "Close" () As Integer
closeのように、引数の無いものはうまくいくのですが、引数のある読み出し、例えばOPENを
Public Declare Function remo_open Lib "pc-op-rs1-control.dll" _
Alias "Open" (ByVal port As Int32) As Integer
このように宣言して
ans = remo_open(1)
のように使用すると、
WindowsApplication1.Module1::remo_open' がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメーターがターゲットのアンマネージ シグネチャに一致していることを確認してください。
とエラーが出てしまいます。
Int32が悪いかと思い
Int16、Int64、UInt32、UInt16、UInt64、Integer、UInt、ByValをByRefにと試してみましたが同様でした。
DLLのソース(C++)では以下のように宣言されています。
PCOPRS1CONTROL_API PCOPRS1CONTROL_RET Open(int port_no)
{
return(ConvertErrorsFromDevPcoprs1(dev.DEV_Open(port_no)));
}
唯一エラーが出なかったのが、
Public Declare Function remo_open Lib "pc-op-rs1-control.dll" _
Alias "Open" () As Integer
でした。
どなたか、間違いと思われる部分がわかる方、ご指摘をお願いいたします。
質問の原文を閉じる
質問の原文を表示する
お礼
ありがとうございます。 Dllimportを使ってみた所、エラーが出ず引数を渡す事ができました。 Imports System.Runtime.InteropServices Public Class Class1 <DllImport("pc-op-rs1-control.dll", CharSet:=CharSet.Unicode, CallingConvention:=CallingConvention.Cdecl)> _ Overloads Shared Function Open(ByVal port As Int32) As Integer End Function End Class