Хочу вызвать из шарпа функцию из файла-exe, написанного на с++. Сделал самый простой пример.
Все хорошо, но падает при попытке выделения (или освобождеиня?) памяти в куче.
Почему такое может быть?
Исключение System.AccessViolationException. "Попытка чтения или записи в защищенную память. "
[DllImport("C:\\ExportFunc.exe")]
private static extern int GetMessageNotice();
static void Main(string[] args)
{
int n = GetMessageNotice();
return;
}
на c++:
extern"C"__declspec (dllexport) int GetMessageNotice()
{
int a = 0;
a++;
int* b = new int; //Если строки убрать, то все ок.delete b; //return a;
}
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
Здравствуйте, ZeBbra, Вы писали:
ZB>Хочу вызвать из шарпа функцию из файла-exe, написанного на с++. Сделал самый простой пример. ZB>Все хорошо, но падает при попытке выделения (или освобождеиня?) памяти в куче. ZB>Почему такое может быть?
Библиотека была не инициализирована и все упало. можно использовать WinAPI функции для выделения памяти.
ZB>Как быть с выделением памяти? Что я делаю не так?
Здравствуйте, Jolly Roger, Вы писали:
JR>Здравствуйте, ZeBbra, Вы писали:
ZB>> Что я делаю не так?
JR>Пытаетесь использовать exe-файл как DLL, а разница между ними несколько больше, чем в раширении имени
Мне всегда казалось, что вызов экспортируемую функцию можно вызвать как из dll так и из exe-шника
Из exe в шарпе как то можно вызывать функции? Не хочется делать специально отдельную длл.
Здравствуйте, ZeBbra, Вы писали:
ZB>Мне всегда казалось, что вызов экспортируемую функцию можно вызвать как из dll так и из exe-шника ZB>Из exe в шарпе как то можно вызывать функции? Не хочется делать специально отдельную длл.
Можно. Но для этого нужно сначала попасть внутрь процесса, созданного из этого экзешника, и там уже вызывать. То есть нужна DLL, которая будет загружена в процесс ExportFunc.exe, вызовет там GetProcAddress с адресом загрузки экзешника в первом параметре (точно не помню, но по-моему можно ноль передать, искать или проверять сейчас неохата ), и вызовет функцию по полученному адресу. Загрузить exe-файл как библиотеку теоретически возможно, но на деле — сплошной геморрой, того не стоящий.
Здравствуйте, Jolly Roger, Вы писали:
JR>Здравствуйте, ZeBbra, Вы писали:
ZB>>Мне всегда казалось, что вызов экспортируемую функцию можно вызвать как из dll так и из exe-шника ZB>>Из exe в шарпе как то можно вызывать функции? Не хочется делать специально отдельную длл.
JR>Можно. Но для этого нужно сначала попасть внутрь процесса, созданного из этого экзешника
как туда попасть, запустить экзешник? То есть без запуска самого экзешника это как бы невозможно?
Здравствуйте, ZeBbra, Вы писали:
ZB> как туда попасть, запустить экзешник? То есть без запуска самого экзешника это как бы невозможно?
У вас в первом сообщении на писано:
extern"C" __declspec (dllexport) int GetMessageNotice()
{
int a = 0;
a++;
int* b = new int; //Если строки убрать, то все ок.
delete b; //return a;
}
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
Если GetMessageNotice без проблемных строк работает то, какие проблемы? Лучше определитесь с тем кто, при вызове GetMessageNotice, отвечает за инициализацию CRT
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.