[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

pl.comp.programming

[VS.2005] Program + DLL w asemblerze

Greg

5/6/2007 1:11:00 PM

Ju? t3umacze z czym sie borykam. Otó?: pisze aplikacje w C++, która ma
tam jakie? zadanie. Chce pod3?czya .dll'ke napisan? w asemblerze, któr?
tak?e pisze ja. Problem le?y w tym, ?e podczas linkowania dostaje b3?d :

error LNK2019: unresolved external symbol _CpuInfo referenced in
function ...

no i teraz tak

Mam ustawione EXPORTS w pliku .def projektu dll'ki. LIBRARY tak?e dobrze
opisane.


Mam poustawiane zale?no?ci w projekcie programu g3ównego.

Mam ustawione Additional Dependencies w projekcie g3ównym programu na
tworzonego .lib'a w projekcie biblioteki.

Mam ustawione import library w projekcie dll'ki (tak aby tworzy3 plik .lib)

Posiadam tak?e wpis w pliku .h programu g3ównego :
extern "C" __declspec(dllexport) void CpuInfo();

Funkcja w kodzie asemblera jest napisana:

CpuInfo PROC

mov eax, 1
cpuid
ret

CpuInfo ENDP

Wa?ne dla mnie jest to, aby dll'ka by3a pod3?czana w sposób statyczny,
czyli bez wykorzystywania LoadLibrary(), GetProcAddress() oraz
FreeLibrary().

I teraz czy mo?e mnie kto? u?wiadomia, co gdzie ?le? Albo na co nie
zwróci3em uwagi?

--
Pozdrawiam,
GregM
13 Answers

Jakub Debski

5/6/2007 1:50:00 PM

0

> error LNK2019: unresolved external symbol _CpuInfo referenced in function ...

> Posiadam tak?e wpis w pliku .h programu g3ównego :
> extern "C" __declspec(dllexport) void CpuInfo();

dllimport zamiast dllexport?
Wydaje mi sie, ?e powinno wystarczya samo
void CpuInfo();
w momencie, kiedy wykorzystujesz plik .lib a nie .dll

poza tym VS 2005 znowu wspiera inline assembly. Mo?esz wrzucia to jako
funkcje w kodzie g3ównym.

pozdrawiam
Jakub


Greg

5/6/2007 2:01:00 PM

0

dnia 2007-05-06 15:50, Jakub Debski nastukal:
>> error LNK2019: unresolved external symbol _CpuInfo referenced in
>> function ...
>
>> Posiadam tak?e wpis w pliku .h programu g3ównego :
>> extern "C" __declspec(dllexport) void CpuInfo();
>
> dllimport zamiast dllexport?
> Wydaje mi sie, ?e powinno wystarczya samo
> void CpuInfo();

I tak i tak nie dzia3a, ten sam unresolved external tylko
__imp__CpuInfo, albo __decl__CpuInfo.

Ju? to sprawdza3em wcze?niej [;

> w momencie, kiedy wykorzystujesz plik .lib a nie .dll
>
> poza tym VS 2005 znowu wspiera inline assembly. Mo?esz wrzucia to jako
> funkcje w kodzie g3ównym.

No w3a?nie za3o?enie niestety ma bya takie, ?e ma bya dll, wiec inline
odpada. Za3o?enie z góry, wiec tego sie nie obejdzie [;

--
Pozdrawiam,
GregM

Greg

5/6/2007 5:37:00 PM

0

dnia 2007-05-06 15:11, GregM nastukal:
> ...wypociny...

No i zrobi3em. Wiedzia3em, ?e kiedy? na to wpadne. Szkoda, ?e tak pó?no.
Zapoda3em dumpbin.exe. Obejrza3em nazwe i szybko wymy?li3em.

extern "C" int __stdcall CpuInfo(int);

[;

--
Pozdrawiam,
GregM

Pawel Kierski

5/7/2007 3:10:00 PM

0

GregM w wiadomo?ci <f1l3nr$hi3$1@inews.gazeta.pl> pisze:
> dnia 2007-05-06 15:11, GregM nastukal:
> > ...wypociny...
>
> No i zrobi3em. Wiedzia3em, ?e kiedy? na to wpadne. Szkoda, ?e tak pó?no.
> Zapoda3em dumpbin.exe. Obejrza3em nazwe i szybko wymy?li3em.
>
> extern "C" int __stdcall CpuInfo(int);

Je?li argument jest int, a wo3anie stdcall, to funkcja musi tego
inta sprz?tn?a ze stosu (ret 4 czy jako? tak). Najlepiej, jakby nie
mia3a argumentów (wtedy konwencja wo3ania w zasadzie nie wa?na.

--
Pawe3 Kierski
news@pkierski.net
dodaj "[nomorespam]" w temacie je?li piszesz z domeny innej ni? .pl,
albo koniecznie chcesz obej?a moje filtry 8-)

Greg

5/7/2007 7:57:00 PM

0

dnia 2007-05-07 17:10, Pawe3 Kierski nastukal:
> GregM w wiadomo?ci <f1l3nr$hi3$1@inews.gazeta.pl> pisze:
>> dnia 2007-05-06 15:11, GregM nastukal:
>>> ...wypociny...
>> No i zrobi3em. Wiedzia3em, ?e kiedy? na to wpadne. Szkoda, ?e tak pó?no.
>> Zapoda3em dumpbin.exe. Obejrza3em nazwe i szybko wymy?li3em.
>>
>> extern "C" int __stdcall CpuInfo(int);
>
> Je?li argument jest int, a wo3anie stdcall, to funkcja musi tego
> inta sprz?tn?a ze stosu (ret 4 czy jako? tak). Najlepiej, jakby nie
> mia3a argumentów (wtedy konwencja wo3ania w zasadzie nie wa?na.

No w3a?nie nie bardzo. Nawet bezargumentowa funckja wymaga podania
extern __stdcall.

W ogóle kilka dni pracy w VS, a ju? mam go do?a. Wole vi + gcc.

--
Pozdrawiam,
GregM

Pawel Kierski

5/7/2007 9:09:00 PM

0

GregM w wiadomo?ci <f1o0ar$5rq$1@inews.gazeta.pl> pisze:
> dnia 2007-05-07 17:10, Pawe3 Kierski nastukal:
> > GregM w wiadomo?ci <f1l3nr$hi3$1@inews.gazeta.pl> pisze:
> >> dnia 2007-05-06 15:11, GregM nastukal:
> >>> ...wypociny...
> >> No i zrobi3em. Wiedzia3em, ?e kiedy? na to wpadne. Szkoda, ?e tak pó?no.
> >> Zapoda3em dumpbin.exe. Obejrza3em nazwe i szybko wymy?li3em.
> >>
> >> extern "C" int __stdcall CpuInfo(int);
> >
> > Je?li argument jest int, a wo3anie stdcall, to funkcja musi tego
> > inta sprz?tn?a ze stosu (ret 4 czy jako? tak). Najlepiej, jakby nie
> > mia3a argumentów (wtedy konwencja wo3ania w zasadzie nie wa?na.
>
> No w3a?nie nie bardzo. Nawet bezargumentowa funckja wymaga podania
> extern __stdcall.

Wymaga? Co sie dzieje, jak nie podasz? Nie chce mi sie teraz pisaa
stosownych przyk3adów, ?eby sprawdzaa...

--
Pawe3 Kierski
news@pkierski.net
dodaj "[nomorespam]" w temacie je?li piszesz z domeny innej ni? .pl,
albo koniecznie chcesz obej?a moje filtry 8-)

Greg

5/7/2007 10:15:00 PM

0

dnia 2007-05-07 23:09, Pawe3 Kierski nastukal:
> GregM w wiadomo?ci <f1o0ar$5rq$1@inews.gazeta.pl> pisze:
>> dnia 2007-05-07 17:10, Pawe3 Kierski nastukal:
>>> GregM w wiadomo?ci <f1l3nr$hi3$1@inews.gazeta.pl> pisze:
>>>> dnia 2007-05-06 15:11, GregM nastukal:
>>>>> ...wypociny...
>>>> No i zrobi3em. Wiedzia3em, ?e kiedy? na to wpadne. Szkoda, ?e tak pó?no.
>>>> Zapoda3em dumpbin.exe. Obejrza3em nazwe i szybko wymy?li3em.
>>>>
>>>> extern "C" int __stdcall CpuInfo(int);
>>> Je?li argument jest int, a wo3anie stdcall, to funkcja musi tego
>>> inta sprz?tn?a ze stosu (ret 4 czy jako? tak). Najlepiej, jakby nie
>>> mia3a argumentów (wtedy konwencja wo3ania w zasadzie nie wa?na.
>> No w3a?nie nie bardzo. Nawet bezargumentowa funckja wymaga podania
>> extern __stdcall.
>
> Wymaga? Co sie dzieje, jak nie podasz? Nie chce mi sie teraz pisaa
> stosownych przyk3adów, ?eby sprawdzaa...

To co pisa3em; unresolved external.

--
Pozdrawiam,
GregM

look@my.sig

5/8/2007 5:23:00 AM

0

Dnia Mon, 7 May 2007 23:09:06 +0200, Pawe3 Kierski napisa3(a):

>> No w3a?nie nie bardzo. Nawet bezargumentowa funckja wymaga podania
>> extern __stdcall.
>
> Wymaga? Co sie dzieje, jak nie podasz? Nie chce mi sie teraz pisaa
> stosownych przyk3adów, ?eby sprawdzaa...

Je?eli nie podasz jawnie ?e to stdcall to kompilator bedzie szuka3
domy?lnie funkcji cdecl, czyli wygl?daj?cej jako? tak: _CpuInfo@4.
Spowodowane jest to tym, ?e kompilator musi wiedziea ile parametrów
przyjmuje funkcja po to, aby poprawnie wyregulowaa stos po jej wywo3aniu.
Przy stdcall nie jest to potrzebne bo funkcja sama to robi...

--
| Maciej Oszutowski | Mowa jest srebrem |
| imagiATpsytranceDOTpl | a milczenie owiec. |

Pawel Kierski

5/8/2007 6:26:00 AM

0

Maciej Oszutowski w wiadomo?ci <fxw9cyuhzn31$.1ljsfjihpyrr2$.dlg@40tude.net> pisze:
> Dnia Mon, 7 May 2007 23:09:06 +0200, Pawe3 Kierski napisa3(a):
>
> >> No w3a?nie nie bardzo. Nawet bezargumentowa funckja wymaga podania
> >> extern __stdcall.
> >
> > Wymaga? Co sie dzieje, jak nie podasz? Nie chce mi sie teraz pisaa
> > stosownych przyk3adów, ?eby sprawdzaa...
>
> Je?eli nie podasz jawnie ?e to stdcall to kompilator bedzie szuka3
> domy?lnie funkcji cdecl, czyli wygl?daj?cej jako? tak: _CpuInfo@4.
> Spowodowane jest to tym, ?e kompilator musi wiedziea ile parametrów
> przyjmuje funkcja po to, aby poprawnie wyregulowaa stos po jej wywo3aniu.
> Przy stdcall nie jest to potrzebne bo funkcja sama to robi...
>

Plik .def do dll rozwi?za3by sprawe - wtedy nazwa funkcji jest
dok3adnie taka, jak zapiszemy w .def. Inna sprawa, ?e wtedy dla
funkcji cdecl z parametrami trzeba ju? samodzielnie zadbaa o poprawne
wywo3anie (deklaracje).
Umkn?3 mi ten problem, bo zazwyczaj u?ywa3em szablonów klasy
"owijaj?cej" 3adownanie .dll i wywo3anie funkcji, a .dll zawsze
robi3em z def i samodzielnie dba3em o zgodno?a konwencji w typie
funkcji.

--
Pawe3 Kierski
news@pkierski.net
dodaj "[nomorespam]" w temacie je?li piszesz z domeny innej ni? .pl,
albo koniecznie chcesz obej?a moje filtry 8-)

Greg

5/8/2007 9:11:00 AM

0

dnia 2007-05-08 08:26, Pawe3 Kierski nastukal:
> Maciej Oszutowski w wiadomo?ci <fxw9cyuhzn31$.1ljsfjihpyrr2$.dlg@40tude.net> pisze:
>> Dnia Mon, 7 May 2007 23:09:06 +0200, Pawe3 Kierski napisa3(a):
>>
>>>> No w3a?nie nie bardzo. Nawet bezargumentowa funckja wymaga podania
>>>> extern __stdcall.
>>> Wymaga? Co sie dzieje, jak nie podasz? Nie chce mi sie teraz pisaa
>>> stosownych przyk3adów, ?eby sprawdzaa...
>> Je?eli nie podasz jawnie ?e to stdcall to kompilator bedzie szuka3
>> domy?lnie funkcji cdecl, czyli wygl?daj?cej jako? tak: _CpuInfo@4.
>> Spowodowane jest to tym, ?e kompilator musi wiedziea ile parametrów
>> przyjmuje funkcja po to, aby poprawnie wyregulowaa stos po jej wywo3aniu.
>> Przy stdcall nie jest to potrzebne bo funkcja sama to robi...
>>
>
> Plik .def do dll rozwi?za3by sprawe - wtedy nazwa funkcji jest
> dok3adnie taka, jak zapiszemy w .def. Inna sprawa, ?e wtedy dla
> funkcji cdecl z parametrami trzeba ju? samodzielnie zadbaa o poprawne
> wywo3anie (deklaracje).
> Umkn?3 mi ten problem, bo zazwyczaj u?ywa3em szablonów klasy
> "owijaj?cej" 3adownanie .dll i wywo3anie funkcji, a .dll zawsze
> robi3em z def i samodzielnie dba3em o zgodno?a konwencji w typie
> funkcji.

Mam *.def. Ale rozumiem, ?e sugerujesz ?eby w nim zapisaa prototyp
funkcji <; ?

--
Pozdrawiam,
GregM