c ++, вызов функции dll со строковой ссылкой / указателем - PullRequest
0 голосов
/ 24 октября 2018

У меня есть решение с двумя проектами, одной DLL и одним консольным приложением.Консольное приложение является клиентом для вызова и тестирования функций в DLL.

Для первой функции greetings я столкнулся с проблемой.Я должен отметить, что я совершенно новичок в C и C ++.

Проект DLL (называемый плагином) выглядит следующим образом:

plugin.h

#include "types.h" // which contains S32 and #include<string>
#define EXPORT extern "C" __declspec (dllexport)
EXPORT S32 WINAPI _3Greetings(string *str);

плагин.cpp

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

Все функции DLL должны возвращать -1 в случае успеха или [1-255] в случае ошибки.Кроме того, у проекта есть plugin.def для решения оформления имени соглашения о вызовах __stdcall.

Консольное приложение выглядит следующим образом:

typedef U32(*GetGreetings)(string);    
HMODULE DllHandler = ::LoadLibrary(L"plugin.dll");
        if (DllHandler != NULL) {
            string greetingText;
            GetGreetings greetings = reinterpret_cast<GetGreetings>(GetProcAddress(DllHandler2, "_3Greetings"));
            greetings(&greetingText); // THE PROBLEM HERE
            cout << greetings << endl;
        }

Проблема в том, что если я добавлю & к greetingText, я получу ошибку:

E0415 Не существует подходящего конструктора для преобразования из "std :: string *" в "std :: basic_string, std :: allocator>"

, а также:

C2664'U32 (std :: string)': невозможно преобразовать аргумент 1 из 'std :: string *' в 'std :: string'

Если я не поставлю &, я получуисключение времени выполнения:

Исключение, выданное в 0x0FA65A72 (plugin.dll) в ConsoleApp.exe: 0xC0000005: Место записи нарушения прав доступа 0xCCCCCC00.

1 Ответ

0 голосов
/ 24 октября 2018

Неправильный тип определения для GetGreeting, он пропускает *

...