Getprocaddress error 127

Here's my DLL code: #include #include int sysLol(char *arg); int sysLol(char *arg) { std::cout<<arg<<"n"; return 1; } And here's my applica...

Here’s my DLL code:

#include <Windows.h>
#include <iostream>

int sysLol(char *arg);

int sysLol(char *arg)
{
   std::cout<<arg<<"n";
   return 1;
}

And here’s my application code:

#include <Windows.h>
#include <iostream>
#include <TlHelp32.h>
#include <stdlib.h>

typedef int (WINAPI* Lol)(char* argv);
struct PARAMETERS
{
    DWORD Lol;
};

int main()
{
    PARAMETERS testData;
    HMODULE e = LoadLibrary(L"LIB.dll"); //This executes without problem
    if (!e) std::cout<<"LOADLIBRARY: "<<GetLastError()<<"n";
    else std::cout<<"LOADLIBRARY: "<<e<<"n";
    testData.Lol = (DWORD)GetProcAddress(e,"sysLol"); //Error 127?
    if (!testData.Lol) std::cout<<testData.Lol<<" "<<GetLastError()<<"n";
    else std::cout<<"MESSAGEBOX: "<<testData.Lol<<"n";
    std::cin.ignore();
    return 1;
}

So, my LIB.dll is successfully loaded using LoadLibrary(), yet GetProcAddress() fails with 127.
This seems to be because it’s not finding my function name, but I don’t see why that would fail.

Assistance is greatly appreciated! :)
~P

asked Sep 16, 2014 at 20:05

Moon's user avatar

0

Since that tag is C++, you’ll need to declare a C name for the function:

extern "C" int sysLol(char *arg);

You can see the actual name the compiler gave your C++ function with Dependency Walker.

When successful, cast the function to pointer returned by GetProcAddress to the actual function type:

typedef int (*sysLol_t)(char *arg);
sysLol_t pFunc = GetProcAddress(e,"sysLol");

answered Sep 16, 2014 at 20:32

egur's user avatar

eguregur

7,7452 gold badges27 silver badges47 bronze badges

0

That is ERROR_PROC_NOT_FOUND which means that there is no exported function with that name.

There’s not much more to say. Perhaps you’ve got the name wrong. It could be a simple mismatch of letter case. Perhaps the DLL has been built incorrectly and is not exporting the function. Perhaps the DLL is decorating or mangling the names. Certainly from the code in the question, there’s no evidence that you attempted to export the function, or indeed suppress decoration/mangling.

Use a tool like dumpbin or Dependency Walker to inspect the names of the functions that are exported. That may shed some light on the problem.

Rather than linking at runtime with LoadLibrary and GetProcAddress, it is much more convenient to link at load time. Use the .lib import library generated when you build the DLL to do that.

It’s also worth pointing out that the calling conventions don’t match. You have cdecl on the DLL side, and stdcall on the executable side. And don’t cast pointers to DWORD. That ends badly when you compile for 64 bit.

answered Sep 16, 2014 at 20:09

David Heffernan's user avatar

David HeffernanDavid Heffernan

596k42 gold badges1055 silver badges1471 bronze badges

5

Symbols must be explicitly exported from Windows DLLs. Either declare your function as __declspec(dllexport) or pass a DEF file to the linker to instruct it to export your function. See this description of dllexport.

answered Sep 16, 2014 at 20:48

Khouri Giordano's user avatar

1

Please use Dependancy Walker and it will give hint about the method name which is registered inside dll.

http://www.dependencywalker.com/

If method name is - getNumber
Dependency Walker will show the actual method name as- _Z9GetNumberd

Ex —

lpGetNumber = (LPGETNUMBER)GetProcAddress(hDLL, "_Z9GetNumberd");

Now LoadLibrary and GetProcAddress() both will work.

CAPSLOCK's user avatar

CAPSLOCK

5,2053 gold badges31 silver badges52 bronze badges

answered Apr 5, 2019 at 12:36

Bhushan Mahajan's user avatar

3

Using DependencyWalker you can view function decorated/undecorated (View->Undecorate C++ functions)

Try to call GetProcAddress with decorated function name form.

answered Nov 7, 2021 at 13:38

Leon .Leon's user avatar

deniska_fob

0 / 0 / 0

Регистрация: 02.12.2013

Сообщений: 44

1

14.11.2015, 23:39. Показов 3447. Ответов 4

Метки нет (Все метки)


C++
1
2
3
SetLastError(0);
       hLIB = LoadLibrary((LPCSTR)"MSVCR120.DLL");
       fprintf(stderr, "Code of error%dn", GetLastError());

Получаю код ошибки 127, «127: Не найдена указанная процедура.»
Но вызов GetProcAddress еще не осуществлялся.

Самое интересное, что возвращается hLIB не NULL. И следовательно я вызываю GetProcAddress,
но тут, если я попытаюсь вызвать функции через указатель на нее, то программа завершается APPCRASH.
В чем может быть проблема?

P.S. Проверил порядка 10 подобных dll, эта dll тут только для примера.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



631 / 142 / 58

Регистрация: 08.04.2015

Сообщений: 365

15.11.2015, 04:35

2

Если hLIB не NULL, то всё в порядке. Вызывать GetLastError() надо, если была ошибка. Раз ошибки нет, то и в вызове смысла нет, он может вернуть код ошибки от какой-то внутренней операции LoadLibrary(), которая не повлияла на общий положительный итог.

А вот почему программа падает — это надо уже смотреть, как к библиотечной функции обращаетесь.



0



0 / 0 / 0

Регистрация: 02.12.2013

Сообщений: 44

15.11.2015, 09:45

 [ТС]

3

UnknownSoldier,

Если hLIB не NULL, то всё в порядке.

Ну вот я проверил сейчас, при MSVCR120.DLL он не NULL, и функцию необходимую находит с помощью GetProcAddress, но при попытке вызвать эту функцию Access violation writing location 0x00000014. Если же использовать MSVCR90D.DLL, то все тоже самое, но функция учпешно вызывается.

В студии видно следующее:
msvcr90d.dll Symbols loaded.
msvcr120.dll Symbols not loaded.



0



Убежденный

Ушел с форума

Эксперт С++

16454 / 7418 / 1186

Регистрация: 02.05.2013

Сообщений: 11,617

Записей в блоге: 1

15.11.2015, 10:53

4

Цитата
Сообщение от deniska_fob
Посмотреть сообщение

C++
1
2
3
SetLastError(0);
hLIB = LoadLibrary((LPCSTR)"MSVCR120.DLL");
fprintf(stderr, "Code of error%dn", GetLastError());

Смысла в данных манипуляциях с last error нет никакого.
Нужно проверять возвращаемое значение, и только в случае ошибки уже
смотреть last error. В остальных случаях (за редкими исключениями,
которые оговорены в MSDN) состояние last error не определено.

Цитата
Сообщение от deniska_fob
Посмотреть сообщение

Самое интересное, что возвращается hLIB не NULL. И следовательно я вызываю GetProcAddress,
но тут, если я попытаюсь вызвать функции через указатель на нее, то программа завершается APPCRASH.
В чем может быть проблема?

Неправильно объявлен прототив вызываемой функции. Например, _cdecl вместо _stdcall.
Или список параметров неверный. Или такой функции в dll нет, но ты не проверяешь,
что GetProcAddress вернула NULL. Не видя кода, трудно догадаться…



0



deniska_fob

0 / 0 / 0

Регистрация: 02.12.2013

Сообщений: 44

15.11.2015, 12:03

 [ТС]

5

Убежденный, вот например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <windows.h>
#include <stdio.h>
 
typedef int(*myfunc)(FILE* stream, const char* format, ...);
 
myfunc fscanf_ = NULL;
 
int main()
{
        int i = 0;
        int x = 0;
 
        HMODULE  hLIB = NULL;
 
        hLIB = LoadLibrary(TEXT("MSVCR120.DLL"));
    
        if (hLIB != NULL) {
            fprintf(stderr, "%sn", "hLIB not NULL!");
        } else {
            fprintf(stderr, "%sn", "hLIB NULL!");
            system("pause");
            return 1;
        }
    
        fscanf_ = (myfunc)GetProcAddress(hLIB, "fscanf");
    
        if (fscanf_ == NULL) {
            fprintf(stderr, "%sn", "fscanf_ NULL");
            system("pause");
            return 1;
        } else {
            fprintf(stderr, "n%sn", "fscanf_ found");
        }
    
        fscanf_(stdin, "%d", &x); // here error
      
        system("pause");
       
        return 0;
}

Результат с ошибкой «Unhandled exception at 0x770ed968 in test.exe: 0xC0000005: Access violation writing location 0x00000014.»:
————————————
hLIB not NULL!

fscanf_ found
Press any key to continue . . .
————————————



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

15.11.2015, 12:03

Помогаю со студенческими работами здесь

Почему после вызова процедуры, когда значение доходит до 5.9, код начинает неправильно работать?
почему после вызова процедуры,когда он доходит до 5.9 он начинает не правильно увеличиваться?
код:…

нужно чтобы функция располагалась до ее вызова, после ее вызова и в другом файле. Как это сделать?
#include &lt;iostream&gt;
#include &lt;conio.h&gt;
using namespace std;

int n, *c;

void fun(int a,…

После вызова печати, я хочу попасть на ту форму что вызывала, и на то поле где была до вызова
Например я в форме на каком-то поле
Вызываю с формы отчет, потом закрываю отчет,
и моя форма…

оформить решение в виде функции следующими способами: 1. функция расположена после ее вызова; 2. функция расположена после до ее вызова; 3. функ
оформить решение в виде функции следующими способами:
1. функция расположена после ее вызова;…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

5

Вот мой код DLL:

#include <Windows.h>
#include <iostream>

int sysLol(char *arg);

int sysLol(char *arg)
{
std::cout<<arg<<"n";
return 1;
}

И вот мой код приложения:

#include <Windows.h>
#include <iostream>
#include <TlHelp32.h>
#include <stdlib.h>

typedef int (WINAPI* Lol)(char* argv);
struct PARAMETERS
{
DWORD Lol;
};

int main()
{
PARAMETERS testData;
HMODULE e = LoadLibrary(L"LIB.dll"); //This executes without problem
if (!e) std::cout<<"LOADLIBRARY: "<<GetLastError()<<"n";
else std::cout<<"LOADLIBRARY: "<<e<<"n";
testData.Lol = (DWORD)GetProcAddress(e,"sysLol"); //Error 127?
if (!testData.Lol) std::cout<<testData.Lol<<" "<<GetLastError()<<"n";
else std::cout<<"MESSAGEBOX: "<<testData.Lol<<"n";
std::cin.ignore();
return 1;
}

Итак, мой LIB.dll успешно загружен с помощью LoadLibrary(), еще GetProcAddress() терпит неудачу с 127.
Кажется, это происходит потому, что он не находит имя моей функции, но я не понимаю, почему это не получится.

Помощь очень ценится! 🙂
~ P

2

Решение

Поскольку этот тег является C ++, вам нужно объявить C название для функции:

extern "C" int sysLol(char *arg);

Вы можете увидеть фактическое имя, которое компилятор дал вашей функции C ++ Зависимость Уокер.

В случае успеха приведите функцию к указателю, возвращенному GetProcAddress, к фактическому типу функции:

typedef int (*sysLol_t)(char *arg);
sysLol_t pFunc = GetProcAddress(e,"sysLol");

3

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

То есть ERROR_PROC_NOT_FOUND Это означает, что не существует экспортируемой функции с таким именем.

Больше сказать нечего. Возможно, вы ошиблись именем. Это может быть простое несоответствие регистра букв. Возможно, DLL была собрана неправильно и не экспортирует функцию. Возможно, DLL украшает или искажает имена. Конечно, из кода в вопросе нет никаких доказательств того, что вы пытались экспортировать функцию или даже подавлять декорирование / искажение.

Используйте такой инструмент, как dumpbin или Dependency Walker для проверки имен экспортируемых функций. Это может пролить свет на проблему.

Вместо того, чтобы связывать во время выполнения с LoadLibrary а также GetProcAddress, гораздо удобнее связать во время загрузки. Для этого используйте библиотеку импорта .lib, сгенерированную при сборке DLL.

Стоит также отметить, что соглашения о вызовах не совпадают. У вас есть cdecl на стороне DLL и stdcall на стороне исполняемого файла. И не бросайте указатели на DWORD, Это плохо заканчивается, когда вы компилируете для 64 бит.

1

Символы должны быть явно экспортированы из Windows DLL. Либо объявите вашу функцию как __declspec(dllexport) или передайте файл DEF компоновщику, чтобы дать ему команду экспортировать вашу функцию. Увидеть это описание dllexport,

0

Questions : GetProcAddress() failing, error 127

2023-02-06T19:11:02+00:00 2023-02-06T19:11:02+00:00

657

Here’s my DLL code:

#include <Windows.h>
#include <iostream>

int sysLol(char *arg);

int sysLol(char *arg)
{
   std::cout<<arg<<"n";
   return 1;
}

And here’s my application code:

#include <Windows.h>
#include <iostream>
#include <TlHelp32.h>
#include <stdlib.h>

typedef int (WINAPI* Lol)(char* argv);
struct PARAMETERS
{
    DWORD Lol;
};

int main()
{
    PARAMETERS testData;
    HMODULE e = LoadLibrary(L"LIB.dll"); //This executes without problem
    if (!e) std::cout<<"LOADLIBRARY: "<<GetLastError()<<"n";
    else std::cout<<"LOADLIBRARY: "<<e<<"n";
    testData.Lol = (DWORD)GetProcAddress(e,"sysLol"); //Error 127?
    if (!testData.Lol) std::cout<<testData.Lol<<" "<<GetLastError()<<"n";
    else std::cout<<"MESSAGEBOX: "<<testData.Lol<<"n";
    std::cin.ignore();
    return 1;
}

So, my LIB.dll is successfully loaded using thread uvdos c++ LoadLibrary(), yet GetProcAddress() fails thread uvdos c++ with 127.
This seems to be because it’s not thread uvdos c++ finding my function name, but I don’t see thread uvdos c++ why that would fail.

Assistance is greatly appreciated! :)
~P

Total Answers 5

27

Answers 1 : of GetProcAddress() failing, error 127

Since that tag is C++, you’ll need to issuse uvdos loadlibrary declare a C name for the function:

extern "C" int sysLol(char *arg);

You can see the actual name the compiler issuse uvdos loadlibrary gave your C++ function with Dependency issuse uvdos loadlibrary Walker.

When successful, cast the function to issuse uvdos loadlibrary pointer returned by GetProcAddress to issuse uvdos loadlibrary the actual function type:

typedef int (*sysLol_t)(char *arg);
sysLol_t pFunc = GetProcAddress(e,"sysLol");

0

2023-02-06T19:11:02+00:00 2023-02-06T19:11:02+00:00Answer Link

mRahman

4

Answers 2 : of GetProcAddress() failing, error 127

That is ERROR_PROC_NOT_FOUND which means issuse uvdos loadlibrary that there is no exported function with issuse uvdos loadlibrary that name.

There’s not much more to say. Perhaps issuse uvdos loadlibrary you’ve got the name wrong. It could be a issuse uvdos loadlibrary simple mismatch of letter case. Perhaps issuse uvdos loadlibrary the DLL has been built incorrectly and issuse uvdos loadlibrary is not exporting the function. Perhaps issuse uvdos loadlibrary the DLL is decorating or mangling the issuse uvdos loadlibrary names. Certainly from the code in the issuse uvdos loadlibrary question, there’s no evidence that you issuse uvdos loadlibrary attempted to export the function, or issuse uvdos loadlibrary indeed suppress decoration/mangling.

Use a tool like dumpbin or Dependency issuse uvdos loadlibrary Walker to inspect the names of the issuse uvdos loadlibrary functions that are exported. That may issuse uvdos loadlibrary shed some light on the problem.

Rather than linking at runtime with issuse uvdos loadlibrary LoadLibrary and GetProcAddress, it is issuse uvdos loadlibrary much more convenient to link at load issuse uvdos loadlibrary time. Use the .lib import library issuse uvdos loadlibrary generated when you build the DLL to do issuse uvdos loadlibrary that.

It’s also worth pointing out that the issuse uvdos loadlibrary calling conventions don’t match. You issuse uvdos loadlibrary have cdecl on the DLL side, and stdcall issuse uvdos loadlibrary on the executable side. And don’t cast issuse uvdos loadlibrary pointers to DWORD. That ends badly when issuse uvdos loadlibrary you compile for 64 bit.

0

2023-02-06T19:11:02+00:00 2023-02-06T19:11:02+00:00Answer Link

karim

6

Answers 3 : of GetProcAddress() failing, error 127

Symbols must be explicitly exported from issuse uvdos loadlibrary Windows DLLs. Either declare your issuse uvdos loadlibrary function as __declspec(dllexport) or issuse uvdos loadlibrary pass a DEF file to the linker to issuse uvdos loadlibrary instruct it to export your function. See issuse uvdos loadlibrary this description of dllexport.

0

2023-02-06T19:11:02+00:00 2023-02-06T19:11:02+00:00Answer Link

karim

3

Answers 4 : of GetProcAddress() failing, error 127

Please use Dependancy Walker and it will issuse uvdos loadlibrary give hint about the method name which is issuse uvdos loadlibrary registered inside dll.

http://www.dependencywalker.com/

If method name is — getNumber
Dependency issuse uvdos loadlibrary Walker will show the actual method name issuse uvdos loadlibrary as- _Z9GetNumberd

Ex —

lpGetNumber = (LPGETNUMBER)GetProcAddress(hDLL, "_Z9GetNumberd");

Now LoadLibrary and GetProcAddress() issuse uvdos loadlibrary both will work.

0

2023-02-06T19:11:02+00:00 2023-02-06T19:11:02+00:00Answer Link

yousuf

6

Answers 5 : of GetProcAddress() failing, error 127

Using DependencyWalker you can view issuse uvdos loadlibrary function decorated/undecorated issuse uvdos loadlibrary (View->Undecorate C++ functions)

Try to call GetProcAddress with issuse uvdos loadlibrary decorated function name form.

0

2023-02-06T19:11:02+00:00 2023-02-06T19:11:02+00:00Answer Link

yousuf

Понравилась статья? Поделить с друзьями:
  • Getobjectasync error handling request 8004100f
  • Getmovie info error
  • Getmanagedobjects failed org freedesktop dbus error noreply did not receive a reply
  • Getlasterror коды ошибок
  • Getjson on error