0

私は本当にCの初心者です。dllを取得するには、ANSICソースをコンパイルする必要があります。コンパイル中にこのエラーが発生します:

 C2491: 'SelectML': definition of dllimport function not allowed

SelectMLは、次の定義を持つパブリック関数です。

int CALLINGCONV SelectML(WORD fid, int nSlot)
{
  WORD SW;
  int x;
  BYTE pSend[2];
  pSend[0]=(BYTE)((fid&0xff00)>>8);
  pSend[1]=(BYTE)(fid&0x00ff);
  x=SendAPDUML(hCards[nSlot],APDU_SELECT,2,0,pSend,0,&SW);
  if (x!=C_OK) return x;
  if (SW!=0x9000) return SW;
  return C_OK;
}

Cソースは良いと確信しています。おそらくそれは単なるVisualStudio構成です...

これは別のリンクされたヘッダーです:

#ifndef LIBSIAECARDT_H
#define LIBSIAECARDT_H

#ifdef __cplusplus
extern "C" {
#endif

#if !defined(USE_STDCALL)
#define USE_STDCALL 1
#endif

#ifdef _WIN32
#   if USE_STDCALL == 1
#       define CALLINGCONV_1 _stdcall
#   else 
#       define CALLINGCONV_1
#   endif

#   if defined(LIBSIAE_EXPORTS)
#       define LIBSIAEAPI __declspec(dllexport)
#   else
#       define LIBSIAEAPI __declspec(dllimport)
#   endif

#   define CALLINGCONV LIBSIAEAPI CALLINGCONV_1


#else // ! _WIN32
#   define CALLINGCONV 
#   define LIBSIAEAPI
#   define CALLINGCONV_1
typedef unsigned int UINT;
#endif  // _WIN32
4

3 に答える 3

0

MSDNで引用されているのは、すべてを物語っています。関数を定義しないでください。宣言は良いです。ここで行っているのは、C2491エラーを確実に生成しているSelectMLを定義することです。

于 2012-09-22T08:27:36.750 に答える
0

CALLINGCONVのようなマクロを条件付きで__declspec(dllimport)または__declspec(dllexport)として定義して、ライブラリソースとライブラリを使用するコードで同じヘッダーファイルを使用できるようにするのが一般的です。ビルドでは、おそらくdllexportを使用するものを定義する必要があります。CALLINGCONVがどのように定義されているかを確認するか、(できれば)コードに付属のビルドドキュメントを参照してください。

于 2012-09-22T09:35:42.583 に答える
-1

別の方法があります。MSVCの使用を停止します。彼らは、C90以降は明示的にサポートを終了しました。Cコードには実際のCコンパイラを使用してください。

于 2012-09-22T14:30:16.037 に答える