powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как найти функцию по ее имени?
25 сообщений из 67, страница 1 из 3
Как найти функцию по ее имени?
    #39715925
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня!

Продолжаю терзать embedded C++.

Возникла необходимость поиска функции по ее имени (строка символов, например "myFunc") с дальнейшем присваиванием ей параметра типа wstring и запуска.
Функция возвращает тоже wstring.

В Дельфи для этого есть процедурный тип, есть ли аналог в C++?
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715926
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если функция есть в таблице экспорта, то GetProcAddress()
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715927
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли функция есть в таблице экспорта, то GetProcAddress()

Имеется ввиду работа с DLL?
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715928
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пишу на С/С++ уже 18 лет и каждый раз, когда я встречаю подобный вопрос, то я не понимаю как автор дошел до такого, что он не знает, где у него какая функция и требуется поиск в run-time.

На мой взгляд, если у тебя возникают подобные проблемы это свидетельствует о плохом дизайне твоего приложения и он должен быть пересмотрен. Для всего остального, вроде скриптовых языков, есть IDispatch .

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

Имеется ввиду работа с DLL?
Обычно экспортируют в DLL, но при желании можно и в EXE.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715935
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebrumЯ пишу на С/С++ уже 18 лет и каждый раз, когда я встречаю подобный вопрос, то я не понимаю как автор дошел до такого, что он не знает, где у него какая функция и требуется поиск в run-time.

На мой взгляд, если у тебя возникают подобные проблемы это свидетельствует о плохом дизайне твоего приложения и он должен быть пересмотрен. Для всего остального, вроде скриптовых языков, есть IDispatch .

Если нужно узнать имя исполняемой кодом функции то используешь макрос __FUNCTION__

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

COM + IDispatch
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715939
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbПрограмме, передается извне, имя функции и параметры, которые она должна выполнить.
или выноси эти функции в DLL и используй GetProcAddress, как уже предложили
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715940
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715941
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebrumSergey_rbПрограмме, передается извне, имя функции и параметры, которые она должна выполнить.
или выноси эти функции в DLL и используй GetProcAddress, как уже предложили

Видимо, это самый оптимальный вариант.

В Дельфи, эти функции объявляются в разделе published и находятся по имени через MethodAddress
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715943
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum example
Это ужасно, особенно тёплые-ламповые скриншоты MSVS 6.
Не уж то за 20 лет не придумали чего-нибудь более удобного чем вся эта куча бойлерплейта, в котором легко допустить ошибку?
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715947
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CerebrumSergey_rbПрограмме, передается извне, имя функции и параметры, которые она должна выполнить.
или выноси эти функции в DLL и используй GetProcAddress, как уже предложили
Не обязательно выносить в DLL, экспортировать можно в EXE, но искать и вызывать можно будет только изнутри этого EXE, но в данном случае это подходит.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715948
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZCerebrum example
Это ужасно, особенно тёплые-ламповые скриншоты MSVS 6.
Не уж то за 20 лет не придумали чего-нибудь более удобного чем вся эта куча бойлерплейта, в котором легко допустить ошибку?

Я пишу на embedded C++, там и такого щастья нет.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715950
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZ,

C/C++ вообще языки, использование которых суть всегда хотьба по канату без страховки.
Для всех остальных, кто боится испачкать руки есть PowerShell и .Net
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715952
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так работает внутри EXE
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
extern "C" __declspec(dllexport) void test_exp(const char* text) {
	printf("%s\n", text);
}

int main(){

	typedef void(__cdecl *p_test_exp)(const char*);
	p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), "test_exp");
	if (test_exp_fn == NULL) {
		printf("test_exp_fn() not found \n");
		return 1;
	}
	test_exp_fn("OK");
	return 0;
}
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715965
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТак работает внутри EXE
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
extern "C" __declspec(dllexport) void test_exp(const char* text) {
	printf("%s\n", text);
}

int main(){

	typedef void(__cdecl *p_test_exp)(const char*);
	p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), "test_exp");
	if (test_exp_fn == NULL) {
		printf("test_exp_fn() not found \n");
		return 1;
	}
	test_exp_fn("OK");
	return 0;
}



Спасибо!

Сделал по примеру, функция появилась в списке экспортируемых функций, но по имени не находится.
Подозреваю, что дело в кодировке , т.к. чтобы проект откомпилировался, приходится добавлять L перед именем функции

Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), L"test_exp");
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715973
SLab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715979
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SLabSergey_rb,
Это ?
https://metanit.com/cpp/tutorial/4.8.php

Не это.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715981
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbDima TТак работает внутри EXE
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
extern "C" __declspec(dllexport) void test_exp(const char* text) {
	printf("%s\n", text);
}

int main(){

	typedef void(__cdecl *p_test_exp)(const char*);
	p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), "test_exp");
	if (test_exp_fn == NULL) {
		printf("test_exp_fn() not found \n");
		return 1;
	}
	test_exp_fn("OK");
	return 0;
}



Спасибо!

Сделал по примеру, функция появилась в списке экспортируемых функций, но по имени не находится.
Подозреваю, что дело в кодировке , т.к. чтобы проект откомпилировался, приходится добавлять L перед именем функции

Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), L"test_exp");



Если не ставить L перед "text_exp" , то ошибка

Код: plaintext
1.
error C2664: 'GetProcAddressW' : cannot convert parameter 2 from 'char [9]' to 'const unsigned short *'
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715988
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если делать так

Код: plaintext
1.
 p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), (unsigned short*) "test_exp");



то все равно не находится.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715997
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rb, а так?:
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), std::wstring("test_exp"));
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39715998
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbЕсли не ставить L перед "text_exp" , то ошибка
Ошибка потому что у тебя проект юникодный, значит надо ставить L.
У меня проект не юникодный, мне не надо ставить.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716001
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_rbЕсли делать так

Код: plaintext
1.
 p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), (unsigned short*) "test_exp");



то все равно не находится.

Ты просто используй имена, которые реально экспортируются dll - http://www.dependencywalker.com/
Может, там и нет того, что ты ищешь.
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716002
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devSergey_rb, а так?:
Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), std::wstring("test_exp"));



Код

Код: plaintext
1.
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), (wstring) "test_exp");



Ошибка

автор error C2440: 'type cast' : cannot convert from 'char [9]' to 'class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >'
...
Рейтинг: 0 / 0
Как найти функцию по ее имени?
    #39716005
Sergey_rb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияSergey_rbЕсли делать так

Код: plaintext
1.
 p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), (unsigned short*) "test_exp");



то все равно не находится.

Ты просто используй имена, которые реально экспортируются dll - http://www.dependencywalker.com/
Может, там и нет того, что ты ищешь.

Я открываю exe в TotalCommander через F3
В разделе экспорта вижу экспротированную функцию test_exp

Думаю, что дело все таки в кодировках.
...
Рейтинг: 0 / 0
25 сообщений из 67, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как найти функцию по ее имени?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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