1

我有这个函数的 C dll:

int CALLINGCONV SMIMESignML(
  const char* pin,
  unsigned long slot,
  const char* szOutputFilePath,
  const char* szFrom,
  const char* szTo,
  const char* szSubject,
  const char* szOtherHeaders,
  const char* szBody,
  const char* szAttachments,
  unsigned long dwFlags,
  int bInitialize
);

CALLINGCONV 是 _stdcall。我用 C++ 调用它:

#include "stdafx.h"
#include "windows.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[]) {
  HMODULE lib = LoadLibrary(_T("libname.dll"));
    typedef int(__stdcall  *FNPTR)(const char* pPin, unsigned long slot, 
      const char* pOut, const char* pFrom, const char* pTo, 
      const char* pSubject, const char* pHeaders, const char* pBody, 
      const char* pAttachments, unsigned int flags, int init);
  FNPTR myfunc = (FNPTR)GetProcAddress(lib, "SMIMESignML");
  if (!myfunc) {
    printf("No function!\n");
  } else {
    int code = myfunc(NULL, 0, "", "", "", NULL, NULL, "", "", 0, 0);
    cout << code << endl;
  }
  return 0;
}

返回值(代码)是错误代码,带这个参数应该是2,这里返回65535——未知错误。

当我在 Pascal 中运行相同的代码时:

unit dll;
interface
const
  JNA_LIBRARY_NAME = 'libname.dll';

function SMIMESignML(pPin: PChar; slot: integer; pOut: PChar; pFrom: PChar; pTo: PChar;
  pSubject: PChar; pHeaders: PChar; pBody: PChar; pAttachments: PChar; flags: integer;
  init: integer): integer; stdcall; external JNA_LIBRARY_NAME;
implementation
end.

program Hello;
uses dll;
var 
  code: integer;
begin
  code := SMIMESignML(nil, 0, '', '', '', nil, nil, '' , '', 0, 0);
  writeln(code);
end.

正如预期的那样,它返回 2。为什么相同的调用表现不同?有什么区别?

操作系统是 Win8x64,编译 c++ 代码我使用 VS2013,lib.dll 是 32 位的。

与此相关的问题: 从 JNA/C 与 Pascal 调用 DLL 的结果不一致, 但该问题不包括 JNA 和 JAVA。

不幸的是,我没有 dll 库的来源,只有一些头文件。

4

0 回答 0