powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как найти функцию по ее имени?
25 сообщений из 67, страница 2 из 3
Как найти функцию по ее имени?
    #39716007
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для тебя правильно так
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), L"test_exp");



Если хочешь чтобы скомпилировалось без L, то в свойствах проекта переключи General - Charaster set = Not set. Но это повлияет на весь проект и в другом месте может перестать компилироваться.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716008
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДля тебя правильно так
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), L"test_exp");



Если хочешь чтобы скомпилировалось без L, то в свойствах проекта переключи General - Charaster set = Not set. Но это повлияет на весь проект и в другом месте может перестать компилироваться.


Переключатель не нашел, в опциях проекта прописано следующее

Код: plaintext
1.
/nologo /W3 /Zi /Od /D "DEBUG" /D "ARM" /D "_ARM_" /D "ARMV4" /D UNDER_CE=$(CEVersion) /D _WIN32_WCE=$(CEVersion) /D "$(CePlatform)" /D "UNICODE" /D "_UNICODE" /Fp"ARMV4Dbg/eTest3.pch" /Yu"stdafx.h" /Fo"ARMV4Dbg/" /Fd"ARMV4Dbg/" /M$(CECrtMTDebug) /c 
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716010
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb,

ну ты первым параметром в GetProcAddress() хоть хэндл загруженной библиотеки используешь?
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716012
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияSergey_rb,

ну ты первым параметром в GetProcAddress() хоть хэндл загруженной библиотеки используешь?

Я не загружаю библиотеку, я ищу функцию в exe.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716014
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это убрать
Код: plaintext
1.
/D "UNICODE" /D "_UNICODE"



но если у тебя имя функции придет как wstring, то правильнее добавить L. Иначе потом надо будет wstring конвертировать в string.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716017
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TОшибка потому что у тебя проект юникодный, значит надо ставить L.
У меня проект не юникодный, мне не надо ставить.Так он уже ставил L перед литералом...
Может у него проект наоборот - неюникодный?
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716018
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb...
Я открываю exe в TotalCommander через F3
В разделе экспорта вижу экспротированную функцию test_exp
...
Скриншот покажи.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716019
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devDima TОшибка потому что у тебя проект юникодный, значит надо ставить L.
У меня проект не юникодный, мне не надо ставить.Так он уже ставил L перед литералом...
Может у него проект наоборот - неюникодный?
Ставил и работало 21701299
Sergey_rbЕсли не ставить L перед "text_exp" , то ошибка
ХЗ почему эта L его смутила.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716020
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Trdb_devпропущено...
Так он уже ставил L перед литералом...
Может у него проект наоборот - неюникодный?
Ставил и работало 21701299
Sergey_rbЕсли не ставить L перед "text_exp" , то ошибка
ХЗ почему эта L его смутила.

С буквой L не находит функцию

Какой тогда тип передавать в эту функцию?

автор wstring f_name;

p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), f_name)

Выдает ошибку
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716021
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima Tпропущено...

Ставил и работало 21701299
пропущено...

ХЗ почему эта L его смутила.

С буквой L не находит функцию

Какой тогда тип передавать в эту функцию?

автор wstring f_name;

p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), f_name)

Выдает ошибку

Ошибка

Код: plaintext
1.
 error C2664: 'GetProcAddressW' : cannot convert parameter 2 from 'class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >' to 'const unsig
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716029
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbавтор wstring f_name;

p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), f_name)

Выдает ошибку
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), f_name.c_str());
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716036
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima Tпропущено...

Ставил и работало 21701299
пропущено...

ХЗ почему эта L его смутила.

С буквой L не находит функцию
Странно. Похоже какие-то особенности компилятора.
Попробуй так без L
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddressA(GetModuleHandle(NULL), "test_exp");
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716040
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я видимо совсем тупой

автор wstring f_name;

f_name.append(L"test_exp");

p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), f_name.c_str());


Не находит функцию.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716044
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbпропущено...


С буквой L не находит функцию
Странно. Похоже какие-то особенности компилятора.
Попробуй так без L
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddressA(GetModuleHandle(NULL), "test_exp");



Проект скомпилировался, но функция не нашлась

может проблема в
Код: plaintext
1.
GetModuleHandle(NULL)
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716051
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbЯ видимо совсем тупой

автор wstring f_name;

f_name.append(L"test_exp");

p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), f_name.c_str());


Не находит функцию.
Ты не торопись wstring использовать. Добейся для начала повторения работы моего примера 21701426


У тебя таких функций много будет? Если немного, то проще как-то так сделать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void run_func(const wstring& f_name) {
  if(f_name == L"fn1") {
     fn1();
  } else if(f_name == L"fn2") {
     fn2();
  } else {
     // Ошибка. Неизвестная функция 
  }
}


Или в std::map загнать список функций при старте проги.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716056
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima Tпропущено...

Странно. Похоже какие-то особенности компилятора.
Попробуй так без L
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddressA(GetModuleHandle(NULL), "test_exp");



Проект скомпилировался, но функция не нашлась

может проблема в
Код: plaintext
1.
GetModuleHandle(NULL)


По хэлпу это должен быть хэндл EXE. Ты же в EXE этот код вставил?
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms683199(v=vs.85).aspx If this parameter is NULL, GetModuleHandle returns a handle to the file used to create the calling process (.exe file).
Можешь проверку добавить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
int main() {
	HMODULE h = GetModuleHandle(NULL);
	if (h == NULL) {
		printf("GetModuleHandle() error \n");
		return 2;
	}
	typedef void(__cdecl *p_test_exp)(const char*);
	p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(h, "test_exp");
	if (test_exp_fn == NULL) {
		printf("test_exp_fn() not found \n");
		return 1;
	}
	test_exp_fn("OK");
	return 0;
}
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716101
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил, хендл формы находится.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716106
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция по прежнему не находится
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716110
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSergey_rbЯ видимо совсем тупой

пропущено...



Не находит функцию.
Ты не торопись wstring использовать. Добейся для начала повторения работы моего примера 21701426


У тебя таких функций много будет? Если немного, то проще как-то так сделать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void run_func(const wstring& f_name) {
  if(f_name == L"fn1") {
     fn1();
  } else if(f_name == L"fn2") {
     fn2();
  } else {
     // Ошибка. Неизвестная функция 
  }
}


Или в std::map загнать список функций при старте проги.

Это на крайний случай.
Хотел сделать как в Дельфи.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716115
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbХотел сделать как в Дельфи.
Хотел - делай. В Си тоже есть процедурный тип. Более, того, он практически ничем не отличается от дельфийского. Поэтому начни с того, что покажи нам свой дельфийский код, а то местные гуру совсем в глухие дебри уйдут.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716127
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb,

Мне как-то пришлось использовать функцию из одной библиотечки, она была описана вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <stdint.h>

#ifdef __cplusplus
extern "C"{
#endif//__cplusplus
	// Initialize recognition library
	__declspec(dllexport) extern uint32_t __stdcall GenerateECCPair(unsigned char* privateCode, uint32_t privateLen, unsigned char* publicCode, uint32_t publicLen);
#ifdef __cplusplus
}
#endif//__cplusplus


Так вот, при попытке найти функцию "GenerateECCPair" ни черта не получалось,
я посмотрел с помощью http://www.dependencywalker.com/, и фактическое имя функции оказалось равным "_GenerateECCPair@16".
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716178
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасия,

Потому рекомендуется все экспортировать как extern "C"
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716199
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglКотовасия,

Потому рекомендуется все экспортировать как extern "C"
Чужай dll-ка была, без исходников.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716210
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияSergey_rb,

Мне как-то пришлось использовать функцию из одной библиотечки, она была описана вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <stdint.h>

#ifdef __cplusplus
extern "C"{
#endif//__cplusplus
	// Initialize recognition library
	__declspec(dllexport) extern uint32_t __stdcall GenerateECCPair(unsigned char* privateCode, uint32_t privateLen, unsigned char* publicCode, uint32_t publicLen);
#ifdef __cplusplus
}
#endif//__cplusplus


Так вот, при попытке найти функцию "GenerateECCPair" ни черта не получалось,
я посмотрел с помощью http://www.dependencywalker.com/, и фактическое имя функции оказалось равным "_GenerateECCPair@16".
Не знаю как в студии, а в GCC можно заманглить хоть что . В коде это можно сделать через вызов abi::__cxa_demangle, ну и потом уже передать в dlsym.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716264
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglПотому рекомендуется все экспортировать как extern "C"

Если ты не заметил, то там именно так и делается. Но у stdcall свои правила.
В любом случае это не то, что надо аффтару.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 67, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как найти функцию по ее имени?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]