Стандартный вызов функции win32 dll отличается в Pascal и Stack Overflow

У меня есть 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-битная.

Вопрос, связанный с этим:
Непоследовательные результаты вызова DLL из JNA / C против Паскаля
но этот вопрос не включает в себя JNA и JAVA.

К сожалению, у меня нет источников библиотеки dll, только некоторые файлы заголовков.

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]