Я полностью новичок в 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 будет работать во всех средах?особенно в этом примере проекта, как мне справиться с этим?