Соглашения об именах экспорта функций dll c ++ (искажение) - PullRequest
0 голосов
/ 24 октября 2018

Я полностью новичок в C ++ и начинаю с создания простого dll и консольного приложения, которое тестирует dll.Плагин dll впоследствии должен работать на машинах x86 (инструменты diag, ECU или PLC).Приведенные мне примеры того, что я использую ту же структуру, экспортируют функцию dll, что и __sdcall.поэтому мой проект helloWorld выглядит следующим образом:

plugin.dll
-----------
plugin.h
#pragma once
#include "types.h"
#define EXPORT extern "C" __declspec (dllexport)
EXPORT S32 WINAPI Greetings(string *str);

plugin.cpp
#include "plugin.h"
#include "types.h"
S32 __stdcall Greetings(string *str){*str = "Hello From Plugin!"; return -1;}

, а консольное приложение выглядит так: (оба находятся в одном решении, project/properties/cc++/adnvances/callingConvention = __cdecl (/Gd))

Настройки VS - конфигурация решения = отладка, платформы решений= x86

main.cpp
HMODULE DllHandler = ::LoadLibrary(L"plugin.dll");
string greetingText;
typedef U32(*Type)(string*);
Type greetings = reinterpret_cast<Type>(GetProcAddress(DllHandler, "Greetings"));
greetings(&greetingText);
cout << greetingText << endl;

Теперь без plugin.def GetProcAddress(DllHandler, "Greetings") возвращает ноль (0x000000) с помощью plugin.def (вместе с EXPORT) Я получаю Greetings с украшением plugin.dll!Greetings@4, вызов будетуспешно, но получить

Ошибка проверки времени выполнения # 0 - Значение ESP не было должным образом сохранено при вызове функции.Обычно это является результатом вызова функции, объявленной с одним соглашением о вызовах с указателем функции, объявленным с другим соглашением о вызовах.

также не допускается приведение с соглашением об именах.Я перечитал много постов о __cdecl __stdcall, но в основном объяснял уровень сборки, который очищает стек, или использовал .def или extern "C" с экспортом.

Я полностью потерялся в соглашении об именах икалечащий в C ++.связано с настройкой локального проекта или DLL будет работать во всех средах?особенно в этом примере проекта, как мне справиться с этим?

...