VB2010でPC-OP-RS1を読み出すとエラー

この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 でした。 どなたか、間違いと思われる部分がわかる方、ご指摘をお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

C++のソースを見たのですが,APIに呼び出し規約の記述がありませんでした。 通常,APIにはStdCallを使うのですが,Cdeclとなっています。 なので,採りうる方法は二つ。 ・DLLの方を修正し,APIに「WINAPI」という修飾をつけて再コンパイルする ・VB側を修正し,DllImportを使ったP/Invokeにする。この時,CallingConventionにCdeclを指定する

hiro4400105
質問者

お礼

ありがとうございます。 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

関連するQ&A

  • C++でのDLL利用について

    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#p92ca3d9 こちらのページで公開されている、pc-op-rs1-control.dllを使って、 自作プログラムを製作しようと考えています。 開発環境はVisual C++です。 上記ページのAPIリファレンスを見ると、 例えばドライバをオープンする関数は PCOPRS1CONTROL_RET Open(int port_no) というように書かれています。 そこで私の書いてみたプログラムは以下のとおりです。 #include <Windows.h> typedef PCOPRS1CONTROL_RET(WINAPI *OPEN)(int port_no); int _tmain(int argc, _TCHAR* argv[]) { HINSTANCE lib; lib = LoadLibrary(TEXT("pc-op-rs1-control.dll")); //dllはEXEファイルと同じディレクトリに配置 if (lib == NULL){ // ここにはエラーメッセージを入力してください printf("dll呼び出しエラー\n"); return -1; } OPEN Open = (OPEN)GetProcAddress(lib,"open"); printf("実行開始"); PCOPRS1CONTROL_RET open = Open(7); if(open == PCOPRS1CONTROL_RET_OK) printf("Open成功"); bool End = FreeLibrary(lib); return 0; } こうすると、 PCOPRS1CONTROL_RETという型が宣言されていない(?)ので、 コンパイルが通りません。 試しに typedef void(WINAPI *OPEN)(int port_no); としてみたりすると、 Open()を実行した瞬間死にます。 pc-op-rs1-control.dllのソースを見ても、 PCOPRS1CONTROL_RET型についての明記が見当たらないような気がするのですが、 どうしたらいいのでしょうか?

  • VB2008でDLLの取込みできない

    VB2008Expressが無料配布していたので始めたばかりの初心者です。 玄人志向の学習リモコン「KURO-RS」(PC-OP-RS1)を操作するアプリを作ろうと試みているのですが、付属のSDKや下記コントロールDLLのVB2008への取り込み方がわかりません。 「PC-OP-RS1-CONTROL.DLL」 http://1c3.world.coocan.jp/wiki/ (「2008-06-08コントロールDLLを作ろう」にあります。VC++ソースもあります) 『参照の追加』を行っても「’~.dll’への参照を追加できませんでした。ファイルがアクセス可能で、有効なアセンブリまたはCOMコンポーネントであることを確認してください」とメッセージが出て取り込むことができませんでした。

  • VB6のAdressOfをVB.NETに変換したい

    以下のソースをVB.NETに変換したいのですが... XOpenDLL関数の AddressOfのあたりがエラーになって変換できません。 (Microsoft Visual Basic .NET 2003の変換機能) Private Declare Function XOpenDLL Lib _ "Maser.dll" _ Alias "OpenDLL" _ (ByVal nModel As Long, _ ByVal nLens As Long, _ ByVal nLensMfr As Long, _ ByVal nGSpeed As Long, _ ByVal nSocketPort As Long, _ ByVal nRS232Port As Long, _ ByVal pCallbackFn As Long) _ As Boolean Private Declare Function XSendCommand Lib _ "Maser.dll" _ Alias "SendCommandVB" _ (ByVal OpCode As Long, _ ByVal PropCode As Long, _ ByVal InputString As String, _ ByRef Output As String) _ As Integer Private Declare Sub XCloseDLL Lib _ "Maser.dll" _ Alias "CloseDLL" () Then to use these functions: ‘ Open the DLL bInstance = XOpenDLL(nModel, nLens, nLensMfr, nGSpeed, nSocketPort, nRS232Port, AddressOf MyCallbackFn) ‘ Send a command nRet = XSendCommand(nOpCode, nPropCode, szInputData, szOutput) ‘ Close the interface Call XCloseDLL お教えください。

  • VB6から参照可能なDLLの作成

    VB6から参照可能なDLLの作成を参考書をみながらしましたが、上手くいかない為質問させていただきます。 開発環境VC++ 2005 C++ CTEST.dll #include <windows.h> __declspec (dllexport) int __stdcall test(int i) { i = i + 5; return i; } .defファイル LIBRARY "test" DESCRIPTION EXPORTS A 以上でDLLを作成し、VB6側で Private Declare test Lib "CTEST.dll" (ByVal i as integer) で宣言しても「エラー53 ファイルがみつかりません」と表示されます。「参照の追加」から参照しようとしても「このファイルは参照できません。」をエラーがでてしまいます。 直すべき点はどの部分なのでしょうか? ご教示ねがいます。

  • VB6.0で、DLLを動的に参照したい

    VB6.0では、DLLを利用する際の宣言部分で、パスを""で括った静的な記載でなく、動的な記載にできるのでしょうか。 色々と調べてみたのですが、イマイチピンとくるものがなかったので質問させていただきました。 例:Public Declare Function Ztest Lib "C:\Test1\Test2" Alias "Test3" (ByVal data1 As Long) As Long                           ↓動的に変更したい   Public Declare Function Ztest Lib "○○:\Test1\Test2" Alias "Test3" (ByVal data1 As Long) As Long

  • dllを使用しVB側に文字列を返す2

    No.280310の質問の続きになってしまいますが 「VCで作ったdllを使用し VBに文字列を返すことはできますか」 でVCで作ったdllをVBを呼び出す事ができるようになりました。 Declare宣言で疑問に思ったのですが Declare Function TxtCnt Lib "hoge.dll" (ByVal a As String) As Long aはなぜ値渡しなのでしょうか? 変数が書き換えられて戻ってくるので、byrefで指定していました。 それが問題が起こしていた原因一つでした。 ちなみにint型の数値をポインタで渡した場合はbyrefでうまくいきます。 ご教授願います。

  • VB .NetのDLL参照について

    名前付パイプの処理をしているのですが、DLLが参照できません。 Public Class ClsJi01   Public Declare Function MakePipe Lib "\DLL\Point.DLL" (ByVal pipe_name As String, ByVal buf_size As Integer, ByVal max_instances As Short, ByVal hpipe As Integer, ByVal err_code As Integer) As Integer  Public Sub M_Pipe()   Dim r As Integer   Dim rpipe As Integer   Dim err_code As Integer   r = MakePipe("\\.\pipe\RS04", 255, 16, rpipe, err_code)  End Sub End Class Point.DLLは以前VB6.0の時に使用していたDLLで自作です。 これで実行すると「オブジェクト参照がオブジェクト インスタンスに設定されていません。」と出ます。 どうしたら良いのでしょうか?

  • VBからのDLL呼び出しでエラー発生

    お世話になります。 Cで作成したDLLをVB6から呼び出した時にエラーが発生します。エラー内容は「実行時エラー'49'DLLが正しく呼び出せません。」です。 いろいろ試してみると、DLL側にパラメータを指定した場合にエラーが発生しているということが分かったのですが、対処方法は分かりませんでした。 以下にソース内容を記述致しますので、何処が悪いのかをご指摘頂けませんでしょうか。 <DLL側(aaa.dll)> __declspec(dllexport) int MyFunction1() { return 4; } __declspec(dllexport) int MyFunction2(int x) { return x * 2; } <VB側> 共通.bas Public Declare Function MyFunction1 Lib "aaa.dll" () As Long Public Declare Function MyFunction2 Lib "aaa.dll" (ByVal a As Long) As Long 実際の使用箇所 Dim param As Long Dim returnCode As Long MsgBox MyFunction1() param = 3 MsgBox MyFunction2(param) どうぞ宜しくお願い致します。

  • VC++で作成したDLLをVBから呼ぶと戻り値が化けてしまう

    はじめまして。いつも勉強させていただいております。 VCは今回初めてやっておりますので当たり前の質問 になってしまうかもしれませんがご教授願います。 以下のような仕様でものづくりを行っております。 1.VBよりVC++で作成したDLLを呼び出す。 2.VC++で作成したDLL側ではパラメータより取得した   値を元に足し算をした結果を   戻り値にセットして要求元に返却する。 といった流れで考えています。 2の部分についてはExeを一度作成し実行させた ところDOS窓に値が表示されました。(printfで) しかし、正しくOUTPUTされた値がVB側の戻り値と して返却された時点で参照すると「-6348」 となっています。 なぜこうなってしまうのか原因がわからず投稿 させて頂きました。 ご存知の方、ご教授下さい。 ************************************************* VC++ DLL側のソース ************************************************* #include <windows.h> #define DLL_EXPORT __declspec(dllexport) extern "C" { DLL_EXPORT int add(int a,int b); } int add(int a,int b) { return a+b; } ************************************************* VB  DLL呼び出し元 ************************************************* Option Explicit Private Declare Function add Lib "C:\Program Files\Microsoft Visual Studio\test\Debug\test.dll" Alias "_add@8" (a As Long, b As Long) As Integer Private Sub Command1_Click() Dim ret As Long ret = add(1, 2) MsgBox ret End Sub 環境 OS:WinXP 言語:VC++6.0    VB6.0(SP6)

  • DLL作成後VBAで使用しようとするとエラーが出ます

    エントリxxがDLLファイルyy内に見つかりません。とエラーが出ます。 複雑な処理をCでやろうとして基本的な箱を作ろうとしたのですがうまくいきません。どなたか教えていただけないでしょうか? C側 #define DLL_EXPORT __declspec(dllexport) extern "C" { DLL_EXPORT void kinou(int a); } void kinou(int a) { //処理 } 呼び出し規約はstdcallしています。 VBA側 Declare Sub kinou Lib ".\test.dll[ (フルリンクしています)] " (ByVal a As Integer) Sub test() Call tasu(10) End Sub

専門家に質問してみよう