Ошибка экспорта из DLL (__stdcall)
От: indee  
Дата: 14.09.20 09:08
Оценка:
Постейшая DLL:

dllmain.cpp
#include "pch.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

int DLLfunc(int i) {

    int j = i;

    j++;

    return j++;
}


pch.h
#include "framework.h"

#ifdef DLLDIR_EX
#define DLLDIR  __declspec(dllexport) __stdcall
#else
#define DLLDIR  __declspec(dllimport)
#endif

extern "C" {

    int DLLDIR DLLfunc(int);


};


Клиент:
#include <iostream>
#include "windows.h"
#include <tchar.h>

typedef int(__stdcall* myFunc)(int);

int main()
{

    HINSTANCE hDLL;

    hDLL = LoadLibrary(_T("...TestDll.dll"));

    if (NULL != hDLL)
    {
        std::cout << "Loaded!\n";

        myFunc funci = (myFunc)GetProcAddress(hDLL, "DLLfunc");
        if (!funci) {
            std::cout << "could not locate the function" << std::endl;
            return EXIT_FAILURE;
        }

        int i = 19;
        int j = funci(i);

        std::cout << "myFunc() returned " << j << std::endl;

    }
    else {
        std::cout << "Not Loaded!\n";
    }

}


В строке:
int j = funci(i);


Ошибка:
Run-Time Check Failure #0 — The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

Но если использовать typedef int(__cdecl* myFunc)(int) все работает без ошибок.

Тоже самое и в Delphi:

function DLLfunc(i : Integer) : Integer; stdcall; external 'TestDll2.dll'; // Access violation
function DLLfunc(i : Integer) : Integer; cdecl; external 'TestDll2.dll'; // Ok


Почему вызов с __stdcall не работает, хотя это используется при описании интерфейса в DLL?
#define DLLDIR  __declspec(dllexport) __stdcall


Савсибо!
Re: Ошибка экспорта из DLL (__stdcall)
От: удусекшл  
Дата: 14.09.20 09:48
Оценка:
Здравствуйте, indee, Вы писали:

I>pch.h

I>
I>#ifdef DLLDIR_EX
I>#define DLLDIR  __declspec(dllexport) __stdcall
I>#else
I>#define DLLDIR  __declspec(dllimport)           /* ??? */
I>#endif
I>


Тут точно ничего не забыто?
Возможно, почему-то срабатывает не та ветка.
Я бы посмотрел, что после препроцессора выходит
Re[2]: Ошибка экспорта из DLL (__stdcall)
От: indee  
Дата: 14.09.20 09:54
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>Здравствуйте, indee, Вы писали:


I>>pch.h

I>>
I>>#ifdef DLLDIR_EX
I>>#define DLLDIR  __declspec(dllexport) __stdcall
I>>#else
I>>#define DLLDIR  __declspec(dllimport)           /* ??? */
I>>#endif
I>>


У>Тут точно ничего не забыто?

У>Возможно, почему-то срабатывает не та ветка.
У>Я бы посмотрел, что после препроцессора выходит

Не забыто, т.к. я экспортирую.
Re[2]: Ошибка экспорта из DLL (__stdcall)
От: indee  
Дата: 14.09.20 10:10
Оценка:
Здравствуйте, удусекшл, Вы писали:

У>Здравствуйте, indee, Вы писали:


I>>pch.h

I>>
I>>#ifdef DLLDIR_EX
I>>#define DLLDIR  __declspec(dllexport) __stdcall
I>>#else
I>>#define DLLDIR  __declspec(dllimport)           /* ??? */
I>>#endif
I>>


У>Тут точно ничего не забыто?

У>Возможно, почему-то срабатывает не та ветка.
У>Я бы посмотрел, что после препроцессора выходит

Точно, вроде игнорит #define DLLDIR __declspec(dllexport) __stdcall
Re: Ошибка экспорта из DLL (__stdcall)
От: kov_serg Россия  
Дата: 14.09.20 13:10
Оценка:
Здравствуйте, indee, Вы писали:

I>Почему вызов с __stdcall не работает, хотя это используется при описании интерфейса в DLL?


extern "C" int __stdcall DLLfunc(int i) {
    int j = i;
    j++;
    return j++;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.