0

我真的是 C 的菜鸟。我只需要编译一个 ANSI C 源代码就可以得到一个 dll。在编译期间,我收到此错误:

 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源是好的,也许它只是一个Visual Studio配置......

这是另一个链接的标题:

#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说明了一切。不要定义函数。宣言很好。您在这里所做的是定义 SelectML,它肯定会生成您的 C2491 错误。

于 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 回答