dll — не найти функцию с помощью GetProcAddress () C ++ VBexpress 13

Итак, я подхожу опасно близко к репосту, но моя ситуация немного отличается от многочисленных других постеров об этой функции. Я взаимодействую с DLL, которая была написана еще в тот день, и все, что у меня есть, это файл. У меня нет файла .lib, поэтому я использую функции LoadLibrary и GetProcessAddress. Я следовал руководству на веб-сайте MSDN, чтобы получить базовую структуру. DLL находится в папке проекта. это компилируется. во время выполнения я получаю числовое значение для «hinstLib», поэтому я предполагаю, что DLL была найдена. Я получаю нулевое значение для переменной «ProcAdd». У других авторов были проблемы, решенные путем добавления extern C в функции DLL, но у меня нет такой возможности. не говоря уже о том, что, насколько мне известно, эта DLL была написана простым языком C. У меня есть документ интерфейса, и я вполне уверен, что у меня правильное имя функции (заменено на общий пример для этих целей). Честно говоря, я ничего не пропустил после назначения ProcAdd, потому что оно получило NULL. Буду очень признателен за любые мысли о том, почему это дает мне значение 0 для назначения функции. Примечание: к сожалению, по разным причинам я не могу загрузить DLL.

    #include <iostream>
#include "stdafx.h"#include "Windows.h"#include <stdio.h>

typedef int(__cdecl *MYPROC)(LPWSTR);

using namespace std;

int main()
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

hinstLib = LoadLibrary(TEXT("dllName.dll"));
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "funcName");

// If the function address is valid, call the function.

if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
//(ProcAdd) (L"Message sent to the DLL function\n");
}
// Free the DLL module.

fFreeResult = FreeLibrary(hinstLib);
}

// If unable to call the DLL function, use an alternative.
if (! fRunTimeLinkSuccess)
printf("Message printed from executable\n");

return 0;

}

1

Решение

Компиляторы обычно искажают имена функций, затем функцию с именем funcName может появиться внутри DLL с именем funcName@16 Например, это зависит от соглашения о вызовах и важно для правильного вызова функции. За __cdecl Соглашение о звонках _funcName 🙂

1

Другие решения


По вопросам рекламы [email protected]