Как сделать метод доступным для других dll в dll c ++ в управляемом коде? - PullRequest
1 голос
/ 21 сентября 2011

Первый фрагмент кода - это пример, над которым я работаю, после его изменения на второй пример он работает, за исключением __declspec (dllexport), который дает __declspec (dllexport), который нельзя применить к функции с вызовом __clrcallусловность.удаление этого фрагмента кода делает компиляцию DLL, но метод недоступен для целевой библиотеки DLL.Также, когда я использую PE Explorer, чтобы заглянуть в DLL, нет методов экспорта.Есть ли управляемый вариант для __declspec (dllexport)?

extern "C" __declspec(dllexport) int UserInstruction (HWND hWnd,
                              HINSTANCE hInst,
                              double FAR *Function, 
                              char FAR *Str1,
                              char FAR *Str2)
{
       strcpy(Str1, "TEST FUNCTION");
       return (TRUE);
}


extern "C" __declspec(dllexport) int UserInstruction (IntPtr hWnd, IntPtr hInst, double *Function, char *Str1, char *Str2)
{
    Str1 = "TEST FUNCTION";
    return (true);
}

1 Ответ

4 голосов
/ 21 сентября 2011

Компилятор C ++ / CLI поддерживает экспорт управляемых функций. Он автоматически генерирует thunk, который загружает и при необходимости инициализирует CLR, чтобы можно было выполнить управляемый код. Остерегайтесь накладных расходов. Однако вы не можете использовать управляемые типы для аргументов функции. IntPtr в вашем случае. Это не имеет смысла, неуправляемый код, который вызывает вашу функцию, не будет использовать управляемые типы.

Тебе придется их приставить. Здесь нет проблем, это указатели, поэтому вы можете просто привести к IntPtr:

extern "C" __declspec(dllexport) 
int __stdcall UserInstruction (HWND hWnd, HINSTANCE hInst, double FAR *Function, char FAR *Str1, char FAR *Str2)
{
    IntPtr windowPtr = (IntPtr)hWnd;
    IntPtr instancePtr = (IntPtr)hInst;
    // etc..
}

Явный выбор соглашения о вызовах - это всегда хорошая идея. По этой причине я добавил __stdcall, наиболее распространенный вариант для экспортируемых функций DLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...