DllImport and memory allocation
От: ZeBbra  
Дата: 20.07.10 12:41
Оценка:
Хочу вызвать из шарпа функцию из файла-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;
}



Как быть с выделением памяти? Что я делаю не так?
Re: DllImport and memory allocation
От: ZeBbra  
Дата: 20.07.10 12:52
Оценка:
Сбилдил dll-ку вместо exe. Заработало нормально.
В чем может быть принципиальная разница?
Важно экспорт сделать из exe-шника...
Re: DllImport and memory allocation
От: Jolly Roger  
Дата: 20.07.10 12:54
Оценка:
Здравствуйте, ZeBbra, Вы писали:


ZB> Что я делаю не так?


Пытаетесь использовать exe-файл как DLL, а разница между ними несколько больше, чем в раширении имени
"Нормальные герои всегда идут в обход!"
Re: DllImport and memory allocation
От: TK Лес кывт.рф
Дата: 20.07.10 12:54
Оценка:
Здравствуйте, ZeBbra, Вы писали:

ZB>Хочу вызвать из шарпа функцию из файла-exe, написанного на с++. Сделал самый простой пример.

ZB>Все хорошо, но падает при попытке выделения (или освобождеиня?) памяти в куче.
ZB>Почему такое может быть?

Библиотека была не инициализирована и все упало. можно использовать WinAPI функции для выделения памяти.

ZB>Как быть с выделением памяти? Что я делаю не так?


Почитайте эту статью http://support.microsoft.com/kb/94248
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: DllImport and memory allocation
От: ZeBbra  
Дата: 20.07.10 13:02
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Здравствуйте, ZeBbra, Вы писали:



ZB>> Что я делаю не так?


JR>Пытаетесь использовать exe-файл как DLL, а разница между ними несколько больше, чем в раширении имени


Мне всегда казалось, что вызов экспортируемую функцию можно вызвать как из dll так и из exe-шника
Из exe в шарпе как то можно вызывать функции? Не хочется делать специально отдельную длл.
Re[3]: DllImport and memory allocation
От: Jolly Roger  
Дата: 20.07.10 13:49
Оценка:
Здравствуйте, ZeBbra, Вы писали:

ZB>Мне всегда казалось, что вызов экспортируемую функцию можно вызвать как из dll так и из exe-шника

ZB>Из exe в шарпе как то можно вызывать функции? Не хочется делать специально отдельную длл.

Можно. Но для этого нужно сначала попасть внутрь процесса, созданного из этого экзешника, и там уже вызывать. То есть нужна DLL, которая будет загружена в процесс ExportFunc.exe, вызовет там GetProcAddress с адресом загрузки экзешника в первом параметре (точно не помню, но по-моему можно ноль передать, искать или проверять сейчас неохата ), и вызовет функцию по полученному адресу. Загрузить exe-файл как библиотеку теоретически возможно, но на деле — сплошной геморрой, того не стоящий.
"Нормальные герои всегда идут в обход!"
Re[4]: DllImport and memory allocation
От: ZeBbra  
Дата: 20.07.10 14:06
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Здравствуйте, ZeBbra, Вы писали:


ZB>>Мне всегда казалось, что вызов экспортируемую функцию можно вызвать как из dll так и из exe-шника

ZB>>Из exe в шарпе как то можно вызывать функции? Не хочется делать специально отдельную длл.

JR>Можно. Но для этого нужно сначала попасть внутрь процесса, созданного из этого экзешника


как туда попасть, запустить экзешник? То есть без запуска самого экзешника это как бы невозможно?
Re[5]: DllImport and memory allocation
От: Jolly Roger  
Дата: 20.07.10 15:15
Оценка:
Здравствуйте, ZeBbra, Вы писали:

ZB> как туда попасть, запустить экзешник? То есть без запуска самого экзешника это как бы невозможно?

теоретически возможно, но на деле — сплошной геморрой, того не стоящий.

"Нормальные герои всегда идут в обход!"
Re[5]: DllImport and memory allocation
От: TK Лес кывт.рф
Дата: 20.07.10 16:40
Оценка:
Здравствуйте, 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
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.