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

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

新規登録して質問してみよう
ただいま回答率
85.49%
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C++

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

Q&A

解決済

2回答

5867閲覧

DLLからのメソッドの呼び出す際における、静的でないメンバー関数の呼び出しのエラー

gazinn

総合スコア13

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C++

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

0グッド

0クリップ

投稿2018/02/06 07:14

編集2018/02/07 06:45

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
visualbasicで作った、センサーから値を読み取るプログラムをC++に書き換えようとしたところ、dllファイル(ATICombinedDAQFT.dll)からメソッドを呼び出そうとした際に"静的でないメンバー関数の呼び出しが正しくありません(error C2352)"というエラーが複数発生しました。
このエラーの解決方法を教えてください。

発生している問題・エラーメッセージ

FTSensor_Communication.h(369): error C2352: 'ATICombinedDAQFT::FTSystem::StartSingleSampleAcquisition': 静的でないメンバー関数の呼び出しが正しくありません FTSensor_Communication.h(370): error C2352: 'ATICombinedDAQFT::FTSystem::SetForceUnits': 静的でないメンバー関数の呼び出しが正しくありません FTSensor_Communication.h(371): 'ATICombinedDAQFT::FTSystem::SetTorqueUnits': 静的でないメンバー関数の呼び出しが正しくありません FTSensor_Communication.h(372): 'ATICombinedDAQFT::FTSystem::LoadCalibrationFile': 静的でないメンバー関数の呼び出しが正しくありません

該当のソースコード

FTSensor_Communication.cpp

#include "stdafx.h" #include "FTSensor_Communication.h" using namespace FTSensor_Communication; [STAThreadAttribute] int main(array<System::String ^> ^args) { // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // メイン ウィンドウを作成して、実行します Application::Run(gcnew Form1()); return 0; }

FTSensor_Communication.h

#pragma once #include <string> const int NUM_STRAIN_GAUGES = 6; // ひずみゲージの数 (does not include thermistor) const int NUM_FT_AXES = 6; // センサの軸の数 const int THERMISTOR_INDEX = 6; // the index (gauge number) of the thermistor double Force_x; // 力覚センサから読み取ったFxの値 double Force_y; // 力覚センサから読み取ったFyの値 double Force_z; // 力覚センサから読み取ったFzの値 double Torque_x; // 力覚センサから読み取ったトルクTxの値 double Torque_y; // 力覚センサから読み取ったトルクTyの値 double Torque_z; // 力覚センサから読み取ったトルクTzの値 double Read[6]; // the force/torque readings from the sensor double Fx_Corr; // 力Fxの初期値補正係数(N) double Fy_Corr; // 力Fyの初期値補正係数(N) double Fz_Corr; // 力Fzの初期値補正係数(N) double Tx_Corr; // トルクTxの初期値補正係数(N・m) double Ty_Corr; // トルクTyの初期値補正係数(N・m) double Tz_Corr; // トルクTzの初期値補正係数(N・m) namespace FTSensor_Communication { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; ///中略 #pragma region Windows Form Designer generated code void InitializeComponent(void){…} #pragma endregion private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { ATICombinedDAQFT::FTSystem::StartSingleSampleAcquisition("dev1", 1000, 16, 0, false); ATICombinedDAQFT::FTSystem::SetForceUnits("N"); ATICombinedDAQFT::FTSystem::SetTorqueUnits("N-m"); ATICombinedDAQFT::FTSystem::LoadCalibrationFile("C:\FT8792.cal", 1); } private: System::Void FT_Measurement_Tick(System::Object^ sender, System::EventArgs^ e) { ATICombinedDAQFT::FTSystem::ReadSingleFTRecord(Read); Force_x = -1 * (Read[0] - Fx_Corr); Force_y = -1 * (Read[1] - Fy_Corr); Force_z = -1 * (Read[2] - Fz_Corr); Torque_x = -1 * (Read[3] - Tx_Corr); Torque_x = -1 * (Read[4] - Tx_Corr); Torque_x = -1 * (Read[5] - Tx_Corr); Fx->Text = Force_x.ToString("F6"); Fy->Text = Force_y.ToString("F6"); Fz->Text = Force_z.ToString("F6"); Tx->Text = Torque_x.ToString("F6"); Ty->Text = Torque_y.ToString("F6"); Tz->Text = Torque_z.ToString("F6"); } ///中略 }; }

ATICombinedDAQFT.dll

.namespace ATICombinedDAQFT { .class public auto ansi sealed beforefieldinit ConnectionType extends [mscorlib]System.Enum{…} .class public auto ansi beforefieldinit FTSystem extends object { // Fields .field private class ATIDAQHardwareInterface m_hiHardware .field private string m_sErrorInfo .field private valuetype Calibration* m_Calibration .field private int32 m_iMaxVoltage .field private int32 m_iMinVoltage .field private float64 m_dUpperSaturationVoltage .field private float64 m_dLowerSaturationVoltage // Methods .method public specialname rtspecialname instance void .ctor () cil managed{…} ///中略 .method public instance int32 StartSingleSampleAcquisition ( string deviceName, float64 sampleFrequency, int32 averaging, int32 firstChannel, bool useTempComp ) cil managed { // Method begins at RVA 0x1308 // Code size 111 (0x6f) .maxstack 8 .locals ( [0] int32 [1] valuetype Calibration* [2] int32 ) IL_0000: ldarg.s useTempComp IL_0002: ldc.i4.0 IL_0003: bne.un.s IL_0008 IL_0005: ldc.i4.0 IL_0006: br.s IL_0009 IL_0008: ldc.i4.1 IL_0009: stloc.2 IL_000a: ldarg.0 IL_000b: ldfld class ATIDAQHardwareInterface class ATICombinedDAQFT.FTSystem::m_hiHardware IL_0010: ldarg.2 IL_0011: ldarg.3 IL_0012: ldarg.1 IL_0013: ldarg.s firstChannel IL_0015: ldloc.2 IL_0016: ldc.i4.6 IL_0017: add IL_0018: ldarg.0 IL_0019: ldfld int32 class ATICombinedDAQFT.FTSystem::m_iMinVoltage IL_001e: ldarg.0 IL_001f: ldfld int32 class ATICombinedDAQFT.FTSystem::m_iMaxVoltage IL_0024: call instance modopt([mscorlib]System.Runtime.CompilerServices.IsLong) int32 ATIDAQHardwareInterface::ConfigSingleSampleTask(float64, int32, string, int32, int32, int32, int32) IL_0029: stloc.0 IL_002a: ldloc.0 IL_002b: brfalse.s IL_0058 IL_002d: ldloc.0 IL_002e: ldc.i4.0 IL_002f: bge.s IL_0044 IL_0031: ldarg.0 IL_0032: dup IL_0033: ldfld class ATIDAQHardwareInterface class ATICombinedDAQFT.FTSystem::m_hiHardware IL_0038: call instance string ATIDAQHardwareInterface::GetErrorInfo() IL_003d: stfld string class ATICombinedDAQFT.FTSystem::m_sErrorInfo IL_0042: br.s IL_0056 IL_0044: ldarg.0 IL_0045: dup IL_0046: ldfld class ATIDAQHardwareInterface class ATICombinedDAQFT.FTSystem::m_hiHardware IL_004b: ldloc.0 IL_004c: call instance string ATIDAQHardwareInterface::GetErrorCodeDescription(modopt([mscorlib]System.Runtime.CompilerServices.IsLong) int32) IL_0051: stfld string class ATICombinedDAQFT.FTSystem::m_sErrorInfo IL_0056: ldc.i4.m1 IL_0057: ret IL_0058: ldarg.0 IL_0059: ldfld valuetype Calibration* class ATICombinedDAQFT.FTSystem::m_Calibration IL_005e: stloc.1 IL_005f: ldc.i4.0 IL_0060: ldloc.1 IL_0061: beq.s IL_006d IL_0063: ldloc.1 IL_0064: ldc.i4 344 IL_0069: add IL_006a: ldarg.s useTempComp IL_006c: stind.i4 IL_006d: ldc.i4.0 IL_006e: ret } // End of method FTSystem.StartSingleSampleAcquisition //中略 .method public instance int32 SetForceUnits ( string forceUnits ) cil managed { // Method begins at RVA 0x1aa8 // Code size 55 (0x37) .maxstack 3 .locals ( [0] int32 [1] valuetype <CppImplementationDetails>.$ArrayType$$$BY0IAA@D ) IL_0000: ldc.i4.0 IL_0001: stloc.0 // loop start (head: IL_0002) IL_0002: ldloc.0 IL_0003: ldarg.1 IL_0004: call instance int32 string::get_Length() IL_0009: bge.s IL_0023 IL_000b: ldloc.0 IL_000c: ldloca.s 1 IL_000e: add IL_000f: ldarg.1 IL_0010: ldloc.0 IL_0011: call instance char string::get_Chars(int32) IL_0016: stind.i1 IL_0017: ldloc.0 IL_0018: ldc.i4.1 IL_0019: add IL_001a: stloc.0 IL_001b: ldloc.0 IL_001c: ldc.i4 2048 IL_0021: blt.s IL_0002 // end loop IL_0023: ldloc.0 IL_0024: ldloca.s 1 IL_0026: add IL_0027: ldc.i4.0 IL_0028: stind.i1 IL_0029: ldarg.0 IL_002a: ldfld valuetype Calibration* class ATICombinedDAQFT.FTSystem::m_Calibration IL_002f: ldloca.s 1 IL_0031: call modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) int16 <Module>::SetForceUnits(valuetype Calibration*, int8*) IL_0036: ret } // End of method FTSystem.SetForceUnits //以下略 }

試したこと

C2352で検索して、同様の事例を探しましたが、DLLからの呼び出しに関するものは見当たりませんでした。

補足情報(FW/ツールのバージョンなど)

cpp,hファイルはvisual studioで作成。
dllファイルは企業が配布しているものなので、コンパイル等できません。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ATICombinedDAQFT.dllがなぜVBのソースコードレベルではなくMSILレベルなのでしょうか?
ATICombinedDAQFT.dllはご自身でコンパイルできる状態では無いのでしょうか。

とりあえず、以下の前提の元解答します。

  • FTSensor_Communication.cpp は C++/CLI

using namespace System::Drawing;等している為)

  • ATICombinedDAQFT.dllは.NET系のdll

extends [mscorlib]している為)

こちらの記事がまとまっているのでこちらをお読み下さい
C++(EXE)からC#(DLL)の関数を呼び出す

投稿2018/02/07 00:31

aglkjggg

総合スコア769

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

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

gazinn

2018/02/07 06:01

ATICombinedDAQFT.dllは自作ではなく、今回使用しているセンサを製造している企業が出してるものなので、コンパイルできる状態になく、DLLの種類も分からないです。上のソースコードはILspyというソフトを用いて、逆コンパイルしたものになります。 URLを参考にやってみます。
guest

0

DLLはVB.NETで作成されたDLLでしょうか?
C#やVB.NETで作成されたDLLは直接C++では呼び出せないと思います。
DLLのソースがあるのなら、DLLをC++で作成し直すか、ネイティブなC++ではなくC++/CLIにするかですね。

下記URLはC#で作成したDLLですが、VB.NETでも同じことです。

参考:[C#] C++からC#のDLLを呼ぶ方法

投稿2018/02/06 09:00

PineMatsu

総合スコア3579

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

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

gazinn

2018/02/07 06:05

自分で作成したDLLファイルでないため、作成しなおすというのは難しい状況です。
PineMatsu

2018/02/07 08:12

静的メソッド内で静的でないメンバは使用できないので、単にそれに引っかかっているだけかもしれません。 以下はC#での例ですが、インスタンスを作成した上で呼び出せばうまくいくかもしれません。 http://d.hatena.ne.jp/shingotada+2/20100720/1279644242
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問