Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | |
[C++] Проблемы с подлинковкой DLL. Нужна помощь!!! 04.07.02 02:27 Число просмотров: 941
Автор: ggg <ggg> Статус: Elderman
|
1) просто назови функцию по другому (напр. MyProc())
main() в C занята и не используется в dll
2) в зависимости от типа функции к её имени могут добавляться разные значки (декорированное имя)
чтобы экспортировать функцию с нужным именем укажи в параметрах линкера /export:exportName=internalName
(а вот здесь уже ничто не мешает exportName задать как main, т.е. /export:main=MyProc)
|
<programming>
|
[C++] Проблемы с подлинковкой DLL. Нужна помощь!!! 03.07.02 18:18
Автор: looptop Статус: Незарегистрированный пользователь
|
Привет. При выходе из функции, указатель на которую мы взяли из подлинкованной библиотеки, проиходит ошибка такого характера: (я не могу понять в чём причина)
--------------------------------------------------------------------------------------
Debug Error!
Program: C:\temp\Cpp2.exe
Module:
File: i386\chkesp.c
Line: 42
The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
---------------------------------------------------------------------------------------
А ошибка происходит при выходе из:
EXECFUNC(psrc,sum);
Исходной код программы:
---------------------------------------------------------------------------------------
typedef void (WINAPI*pFUNC)(int*,int);
.....
HINSTANCE hLib;
pFUNC EXECFUNC;
.....
hLib=LoadLibrary("TempLibrary/tmplib.dll");
EXECFUNC=(pFUNC)GetProcAddress(hLib, "main");
.....
if(EXECFUNC==NULL)
{
FreeLibrary((HMODULE)hLib);
return -4;
}
printf("before: sum = %d\n",sum);
EXECFUNC(psrc,sum); //при выходе - ошибка
printf("after: sum = %d\n",sum);
FreeLibrary((HMODULE)hLib);
.....
---------------------------------------------------------------------------------------
Код самой библиотеки:
#include "stdafx.h"
#include <stdio.h>
extern "C" __declspec(dllexport) void main(int *psrc,int sum)
{
printf("+IN LIBRARY MAIN()+\n");
for(int i=0;i<9;i++) {
printf("src[%d] = %d\n",i,psrc[i]);
sum+=psrc[i];
}
printf("Sum = %d\n",sum);
return;
}
---------------------------------------------------------------------------------------
Помогите понять в чём проблема?!!!
С Уважением looptop!
|
|
[C++] Проблемы с подлинковкой DLL. Нужна помощь!!! 03.07.02 21:14
Автор: ggg <ggg> Статус: Elderman
|
1) как то это не хорошо определять main() с нестандартными параметрами
2) не линкуется потому что в main не указал WINAPI
|
| |
[C++] Проблемы с подлинковкой DLL. Нужна помощь!!! 03.07.02 22:33
Автор: looptop Статус: Незарегистрированный пользователь
|
А как сделать правильно по первому пункту и по второму...
по второму я пробовал добавлять WINAPI: "...void WINAPI main(......", но в этом случае у меня получается, что не находится функция main из библиотеки....
Был бы очень признателен, если бы ты помог и объяснил мне поподробнее :)
> 1) как то это не хорошо определять main() с нестандартными > параметрами > > 2) не линкуется потому что в main не указал WINAPI
|
| | |
[C++] Проблемы с подлинковкой DLL. Нужна помощь!!! 04.07.02 02:27
Автор: ggg <ggg> Статус: Elderman
|
1) просто назови функцию по другому (напр. MyProc())
main() в C занята и не используется в dll
2) в зависимости от типа функции к её имени могут добавляться разные значки (декорированное имя)
чтобы экспортировать функцию с нужным именем укажи в параметрах линкера /export:exportName=internalName
(а вот здесь уже ничто не мешает exportName задать как main, т.е. /export:main=MyProc)
|
| | | |
[C++] У тебя срыв стека потому, что: 04.07.02 04:12
Автор: Zef <Alloo Zef> Статус: Elderman
|
ф-ция объявлена как __declspec, значит после выхода из нее вызывающий код сам должен удалять переменные из стека:
PUSH Par1
.
.
.
PUSH ParN
CALL Function
ADD ESP,N,
а вызываешь ты ее по умолчанию как __stdcall. __stdcall - ф-ции сами должны "убирать за собой" вот так:
RET N.
В твоем это должно выглядеть так:
EXECFUNC=((void __declspec(*)(int *,int))GetProcAddress(hLib, "main");
|
|
|