DLL интерфейс между SW - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть опыт работы с C# и C / C ++, но я никогда не работал с DLL, поэтому я пытаюсь выяснить, как это работает.

Мне нужно интегрировать нативный интерфейс API dll между третьей частью Программное обеспечение и мой будущий маленький SW, который собирается заменить оригинал.

Спецификации из третьей части ограничены и описывают прототип как:

Error GetInfo([in/out]LPTSTR errorInfo, [in]DWORD errorBufferLength);

Я создал проект dll с CodeBlocks и MINGW Теперь моя цель - получить первоначальный отзыв, поэтому в файле dll. cpp Я написал этот код:

DLL_EXPORT TCHAR x[5];

Error DLL_EXPORT GetInfo(LPTSTR errorInfo, DWORD errorBufferLength)
{
    x = TEXT("test");

    errorInfo = x;
    errorBufferLength = sizeof(TCHAR*5);

    return NO_ERROR;
}

, а в main.h есть:

extern "C" DLL_EXPORT TCHAR x[];

#ifdef __cplusplus
extern "C"
{
#endif
Error DLL_EXPORT GetInfo(LPTSTR errorInfo, DWORD ErrorBufferLength);

}

когда я просматриваю журнал третьей части в строке errorInfo, я обнаружил «поврежденную» строку с символом ASCII, как будто я указываю на неправильную позицию в памяти или формат неверный. Используя оригинальную DLL, вывод верен. Я пробовал разные формы, чтобы назначить правильные значения указателю LPTSTR и DWORD, но я уверен, что что-то упускаю из теории.

Есть ли у вас какие-либо предложения? Извините за мое "быть новичком"

1 Ответ

0 голосов
/ 20 апреля 2020

errorInfo - указатель, предоставляемый вызывающей стороной GetInfo () . Вы не можете перезаписать это. В настоящее время в буфер вызывающей стороны ничего не копируется.

Так что вам нужно будет использовать одну из функций копирования строк:

https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strncpy-strncpy-l-wcsncpy-wcsncpy-l-mbsncpy-mbsncpy-l?view=vs-2019

Я предполагаю errorBufferLength содержит размер буфера, предоставленного вызывающей стороной. Поэтому вам нужно ограничить копию этой копией.

Например:

#include <tchar.h>
#include <Windows.h>

const TCHAR g_const_text[] = _T("Hello World!");

void getString(LP s, size_t bufSize)
{
    _tcsncpy_s(s, bufSize, g_const_text, _tcslen(g_const_text));
}

int main()
{
    TCHAR t[100];
    getString(t, 100);
    MessageBox(NULL, t, _T("test"), MB_OK);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...