Я создал программу на C#, которая использует
NativeMethods.LoadLibrary()
NativeMethods.GetProcAddress
Marshal.GetDelegateForFunctionPointer
для создания функций C# для функций библиотеки dll. Эта программа работает нормально.
Однако мне нужно создать свою собственную DLL, и у меня возникли проблемы, с которыми я надеялся, что кто-нибудь сможет помочь. Я использую Visual Studio 2019.
В качестве примера в документации RP120 указано, что функция должна быть объявлена следующим образом:
Код: Выделить всё
void DLLEXPORT WINAPI RP1210_ReadVersion(char* DLLMajor, char* DLLMinor, char* APIMajor, char* APIMinor)
Код: Выделить всё
pAddressOfFunctionToCall = NativeMethods.GetProcAddress(pDll, "RP1210_ReadVersion");
if (pAddressOfFunctionToCall != IntPtr.Zero)
{
RP1210_ReadVersion = (TRP1210_READVERSION)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, typeof(TRP1210_READVERSION));
}
Код: Выделить всё
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate short TRP1210_READVERSION(StringBuilder DLLMajor, StringBuilder DLLMinor, StringBuilder APIMajor, StringBuilder APIMinor);
При создании своей собственной DLL я использую такое объяснение
Код: Выделить всё
extern __declspec(dllexport) short _cdecl RP1210_ReadVersion(char* DLLMajor, char* DLLMinor, char* APIMajor, char* APIMinor)
Но если я попытаюсь вызвать функцию, я получу исключение несбалансированного стека
если я использую точное определение, как в документации, и использую WINAPI
Код: Выделить всё
extern __declspec(dllexport) short WINAPI RP1210_ReadVersion(char* DLLMajor, char* DLLMinor, char* APIMajor, char* APIMinor)
если я перейду на __stdcall, как в моем определении типа C#
Код: Выделить всё
extern __declspec(dllexport) short __stdcall RP1210_ReadVersion(char* DLLMajor, char* DLLMinor, char* APIMajor, char* APIMinor)
Я не понимаю, что мне нужно сделать, чтобы определить функцию и чтобы вызов GetProcAddress был успешным, а функция работала без повреждения стека.
Подробнее здесь: https://stackoverflow.com/questions/798 ... om-c-sharp
Мобильная версия