Итак, я подхожу опасно близко к репосту, но моя ситуация немного отличается от многочисленных других постеров об этой функции. Я взаимодействую с 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;
}
Компиляторы обычно искажают имена функций, затем функцию с именем funcName
может появиться внутри DLL с именем funcName@16
Например, это зависит от соглашения о вызовах и важно для правильного вызова функции. За __cdecl
Соглашение о звонках _funcName
🙂