1

はじめに 私は、大学の授業を受けた後、C++ を再学習しています。私は最近、使用する予定の USB 接続を備えた Arcus Performax PMX-4EX-SA-TB9 ステッピング モーター コントローラーを入手しました。同社は、独自のコードを使用してステッパーを手動で制御するソフトウェアを提供し、ソフトウェア内に端末を提供して、コントローラーに1行のコードを送信してステッパーを制御できるようにします. 加速や最高速度など、あらゆる種類のものを制御できます。これで遊ぶのは楽しかったですが、今はもっと先に進みたいと思っています。オンライン マニュアルには、C++ を使用してステッパー用の独自のプログラムを作成する方法が記載されており、必要と思われるファイルをダウンロードしました。DLL ファイル、lib ファイル、およびヘッダー ファイルがあります。このようにして、DLL ファイルが実行可能ファイルの実行時に使用されるダイナミック リンク ライブラリであることを知りました。lib ファイルとヘッダー ファイルを読んだところ、モーター コマンドの一部に似た関数宣言がヘッダー ファイルにあると思われることがわかりました。以下にヘッダーファイルを挿入します。

私の質問

DLL ファイルを lib およびヘッダーと一緒に使用して、ヘッダー ファイルに表示されている機能を使用してこのデバイスを制御できますか? これをすべて読み込むにはどうすればよいですか?以下に含まれる fnPerformaxComDoMove 関数を使用して、短い小さな例を書いてくれる人はいますか? そこから行けるように?私は Visual Studio C++ 2013 を使用しており、自分で作成した DLL の作成と使用に関するオンライン チュートリアルを実行しましたが、これらはすべて、これに比べて非常に単純に見えます。

私の貧弱な理解

DLL、ヘッダー、および lib ファイルが提供されているので、インポート バージョンではなく _declspec(dllexport) 定義を使用すると思います。すべての関数宣言は、「BOOL」、「PERFORMAXCOM_API」、「_stdcall」のように始まります。私は、型、​​関数名、括弧内の引数を見ることに慣れているだけです。すべての異なる関数の前にある「PERFORMAX_API」と「_stdcall」は何を意味しますか? DWORD はダブル ワードであり、32 ビット整数であることは理解していますが、引数の一部は x、y、z などの軸を要求します... char を要求できたのに、なぜ数値が必要なのですか? どんな情報でも私を助けることができる人に感謝します。これの使い方を知りたいです。

ヘッダ

    #ifdef PERFORMAXCOM_EXPORTS
    #define PERFORMAXCOM_API __declspec(dllexport)
    #else
    #define PERFORMAXCOM_API __declspec(dllimport)
    #endif

    extern PERFORMAXCOM_API int nPerformaxCom;

    #ifdef __cplusplus
    extern "C" {
    #endif

    PERFORMAXCOM_API int fnPerformaxCom(void);

    //USB reset

    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComUSBReset(IN HANDLE pHandle);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComFlush(IN HANDLE pHandle);

    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComGetNumDevices(OUT LPDWORD         lpNumDevices);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComGetProductString(IN DWORD dwNumDevices, OUT LPVOID lpDeviceString, IN DWORD dwOptions);    
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComOpen(IN DWORD dwDeviceNum, OUT HANDLE* pHandle);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComClose(IN HANDLE pHandle);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetTimeouts(IN DWORD dwReadTimeout, DWORD dwWriteTimeout);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSendRecv(IN HANDLE pHandle, IN LPVOID wBuffer, IN DWORD dwNumBytesToWrite,IN DWORD dwNumBytesToRead,OUT LPVOID rBuffer);

    signed int PERFORMAXCOM_API _stdcall fnPerformaxMove(IN HANDLE pHandle, 
                                                        IN int commandCode, 
                                                        IN int axes,
                                                IN int moveDir,
                                                IN long *value,
                                                IN int modelCode);

    signed int PERFORMAXCOM_API _stdcall fnPerformaxCommandReply(IN HANDLE pHandle, 
                                                         IN char *command, 
                                                         IN char *reply);

    signed int PERFORMAXCOM_API _stdcall fnPerformaxIO(IN HANDLE pHandle, 
                                                IN int commandCode, 
                                                IN int bitNumber,
                                                IN long *value,
                                                IN int modelCode);

    signed int PERFORMAXCOM_API _stdcall fnPerformaxMotorStat(IN HANDLE pHandle, 
                                                IN int commandCode, 
                                                IN int axes,
                                                IN long *value,
                                                IN int modelCode);

    signed int PERFORMAXCOM_API _stdcall fnPerformaxSpeedAccel(IN HANDLE pHandle, 
                                                       IN int commandCode, 
                                                       IN int axes,
                                                       IN long *value,
                                                       IN int modelCode);

    signed int PERFORMAXCOM_API _stdcall fnPerformaxGeneral(IN HANDLE pHandle, 
                                                    IN int commandCode, 
                                                    IN int axes,
                                                    IN long *value,  
                                                    IN int modelCode);


    long PERFORMAXCOM_API _stdcall fnPerformaxComGetAxisStatus(IN HANDLE pHandle,DWORD dwAxisNumber);
    long PERFORMAXCOM_API _stdcall fnPerformaxComGetPulseSpeed(IN HANDLE pHandle,DWORD dwAxisNumber);
    long PERFORMAXCOM_API _stdcall fnPerformaxComGetPulsePos(IN HANDLE pHandle,DWORD dwAxisNumber);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetPulsePos(IN HANDLE pHandle,DWORD dwAxisNumber, DWORD pos);
    long PERFORMAXCOM_API _stdcall fnPerformaxComGetEncoderPos(IN HANDLE pHandle,DWORD dwAxisNumber);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetEncoderPos(IN HANDLE pHandle,DWORD dwAxisNumber, DWORD pos);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetPolarity(IN HANDLE pHandle,DWORD dwAxisNumber,DWORD dwPolarity);
    long PERFORMAXCOM_API _stdcall fnPerformaxComGetPolarity(IN HANDLE pHandle,DWORD dwAxisNumber);
    long PERFORMAXCOM_API _stdcall fnPerformaxComGetDIOSetup(IN HANDLE pHandle);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetDIOSetup(IN HANDLE pHandle, DWORD dio_setup);
    long PERFORMAXCOM_API _stdcall fnPerformaxComGetDIO(IN HANDLE pHandle);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComGetDIOBit(IN HANDLE pHandle,DWORD bitn);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetDIO(IN HANDLE pHandle,DWORD dio_value );
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetDIOBit(IN HANDLE pHandle,DWORD bitn,DWORD bitv );
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComDoHome(IN HANDLE pHandle,
                                                               DWORD axis,
                                                               DWORD dir,
                                                       DWORD low_speed,
                                                       DWORD high_speed,
                                                       DWORD accel_time,
                                                       DWORD decel_time,
                                                       DWORD search_mode,
                                                       DWORD ramp_mode);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComDoMove(IN HANDLE pHandle,
                                                       DWORD axisn,
                                                       DWORD target,
                                                       DWORD low_speed,
                                                       DWORD high_speed,
                                                       DWORD accel_time,
                                                       DWORD decel_time);
    BOOL PERFORMAXCOM_API _stdcall fnPerformaxComStop(IN HANDLE pHandle,
                                                       DWORD axisn,
                                                       DWORD ramp_stop);






    #ifdef __cplusplus
    }
    #endif
4

2 に答える 2

1

プロジェクトでヘッダー ファイルを使用すると、PERFORMAXCOM_API は __declspec(dllimport) になるため、各関数は DLL インポートとして宣言されます。_stdcall は、各関数の呼び出し規約です。基本的に、これらの詳細を無視して、関数を呼び出すコードを記述できます。

于 2014-06-27T03:18:15.847 に答える