Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Как найти функцию по ее имени?  [new]
Sergey_rb
Member

Откуда:
Сообщений: 824
Доброго дня!

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

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

В Дельфи для этого есть процедурный тип, есть ли аналог в C++?
11 окт 18, 09:40    [21701205]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Dima T
Member

Откуда:
Сообщений: 12627
Если функция есть в таблице экспорта, то GetProcAddress()
11 окт 18, 09:49    [21701208]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Sergey_rb
Member

Откуда:
Сообщений: 824
Dima T
Если функция есть в таблице экспорта, то GetProcAddress()


Имеется ввиду работа с DLL?
11 окт 18, 09:56    [21701209]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Cerebrum
Member

Откуда: Омикрон Персей 8
Сообщений: 7720
Я пишу на С/С++ уже 18 лет и каждый раз, когда я встречаю подобный вопрос, то я не понимаю как автор дошел до такого, что он не знает, где у него какая функция и требуется поиск в run-time.

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

Если нужно узнать имя исполняемой кодом функции то используешь макрос __FUNCTION__
11 окт 18, 09:57    [21701210]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Dima T
Member

Откуда:
Сообщений: 12627
Sergey_rb
Dima T
Если функция есть в таблице экспорта, то GetProcAddress()


Имеется ввиду работа с DLL?

Обычно экспортируют в DLL, но при желании можно и в EXE.
11 окт 18, 09:59    [21701213]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Sergey_rb
Member

Откуда:
Сообщений: 824
Cerebrum
Я пишу на С/С++ уже 18 лет и каждый раз, когда я встречаю подобный вопрос, то я не понимаю как автор дошел до такого, что он не знает, где у него какая функция и требуется поиск в run-time.

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

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


Программе, передается извне, имя функции и параметры, которые она должна выполнить.
11 окт 18, 10:02    [21701219]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Cerebrum
Member

Откуда: Омикрон Персей 8
Сообщений: 7720
Sergey_rb,

COM + IDispatch
11 окт 18, 10:04    [21701221]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Cerebrum
Member

Откуда: Омикрон Персей 8
Сообщений: 7720
Sergey_rb
Программе, передается извне, имя функции и параметры, которые она должна выполнить.

или выноси эти функции в DLL и используй GetProcAddress, как уже предложили
11 окт 18, 10:08    [21701223]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Cerebrum
Member

Откуда: Омикрон Персей 8
Сообщений: 7720
example
11 окт 18, 10:13    [21701227]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Sergey_rb
Member

Откуда:
Сообщений: 824
Cerebrum
Sergey_rb
Программе, передается извне, имя функции и параметры, которые она должна выполнить.

или выноси эти функции в DLL и используй GetProcAddress, как уже предложили


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

В Дельфи, эти функции объявляются в разделе published и находятся по имени через MethodAddress
11 окт 18, 10:13    [21701228]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
NekZ
Member

Откуда: Санкт-Петербург
Сообщений: 3442
Cerebrum
example

Это ужасно, особенно тёплые-ламповые скриншоты MSVS 6.
Не уж то за 20 лет не придумали чего-нибудь более удобного чем вся эта куча бойлерплейта, в котором легко допустить ошибку?
11 окт 18, 10:16    [21701230]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Dima T
Member

Откуда:
Сообщений: 12627
Cerebrum
Sergey_rb
Программе, передается извне, имя функции и параметры, которые она должна выполнить.

или выноси эти функции в DLL и используй GetProcAddress, как уже предложили

Не обязательно выносить в DLL, экспортировать можно в EXE, но искать и вызывать можно будет только изнутри этого EXE, но в данном случае это подходит.
11 окт 18, 10:20    [21701238]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Sergey_rb
Member

Откуда:
Сообщений: 824
NekZ
Cerebrum
example

Это ужасно, особенно тёплые-ламповые скриншоты MSVS 6.
Не уж то за 20 лет не придумали чего-нибудь более удобного чем вся эта куча бойлерплейта, в котором легко допустить ошибку?


Я пишу на embedded C++, там и такого щастья нет.
11 окт 18, 10:21    [21701239]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Cerebrum
Member

Откуда: Омикрон Персей 8
Сообщений: 7720
NekZ,

C/C++ вообще языки, использование которых суть всегда хотьба по канату без страховки.
Для всех остальных, кто боится испачкать руки есть PowerShell и .Net
11 окт 18, 10:22    [21701241]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Dima T
Member

Откуда:
Сообщений: 12627
Так работает внутри EXE
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;
}
11 окт 18, 10:31    [21701244]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Sergey_rb
Member

Откуда:
Сообщений: 824
Dima T
Так работает внутри EXE
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 перед именем функции

p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), [b]L[/b]"test_exp");
11 окт 18, 10:49    [21701265]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
SLab
Member

Откуда: Пенза
Сообщений: 298
Sergey_rb,
Это ?
https://metanit.com/cpp/tutorial/4.8.php
11 окт 18, 10:59    [21701282]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Sergey_rb
Member

Откуда:
Сообщений: 824
SLab
Sergey_rb,
Это ?
https://metanit.com/cpp/tutorial/4.8.php


Не это.
11 окт 18, 11:03    [21701295]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Sergey_rb
Member

Откуда:
Сообщений: 824
Sergey_rb
Dima T
Так работает внутри EXE
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 перед именем функции

p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), [b]L[/b]"test_exp");


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

error C2664: 'GetProcAddressW' : cannot convert parameter 2 from 'char [9]' to 'const unsigned short *'
11 окт 18, 11:06    [21701299]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Sergey_rb
Member

Откуда:
Сообщений: 824
Если делать так

 p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), (unsigned short*) "test_exp");


то все равно не находится.
11 окт 18, 11:12    [21701309]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 2388
Sergey_rb, а так?:
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), std::wstring("test_exp"));
11 окт 18, 11:23    [21701326]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Dima T
Member

Откуда:
Сообщений: 12627
Sergey_rb
Если не ставить L перед "text_exp" , то ошибка

Ошибка потому что у тебя проект юникодный, значит надо ставить L.
У меня проект не юникодный, мне не надо ставить.
11 окт 18, 11:24    [21701329]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Котовасия
Member

Откуда:
Сообщений: 942
Sergey_rb
Если делать так

 p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), (unsigned short*) "test_exp");


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


Ты просто используй имена, которые реально экспортируются dll - http://www.dependencywalker.com/
Может, там и нет того, что ты ищешь.
11 окт 18, 11:28    [21701338]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Sergey_rb
Member

Откуда:
Сообщений: 824
rdb_dev
Sergey_rb, а так?:
p_test_exp test_exp_fn = (p_test_exp)GetProcAddress(GetModuleHandle(NULL), std::wstring("test_exp"));


Код

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> >'
11 окт 18, 11:28    [21701340]     Ответить | Цитировать Сообщить модератору
 Re: Как найти функцию по ее имени?  [new]
Sergey_rb
Member

Откуда:
Сообщений: 824
Котовасия
Sergey_rb
Если делать так

 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

Думаю, что дело все таки в кодировках.
11 окт 18, 11:31    [21701345]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / C++ Ответить