Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Assembler » mit fasm dll machen und in c/c++ verwenden??

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
22.09.2005, 21:42 Uhr
RedEagle



Hi
Ich hab mit fasm eine DLL gemacht:

asm:
; DLL creation example

format PE GUI 4.0 DLL
entry DllEntryPoint

include 'win32a.inc'

section '.code' code readable executable

proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
        mov     eax,TRUE
        ret
endp

; void soundoff();
proc soundoff
in  al,0x61
and al,11111100b
out 0x61,al
ret
endp

; void sound(int freq);
proc sound freq
  mov ebx,[freq]
  mov ax,0x34DD ;Frequenz wird in bx übergeben
  mov dx,0x0012
  cmp dx,bx
   jnc done
  div bx
  mov bx,ax
  in  al,0x61
  test al,3
   jnz A99
  or  al,3
  out 0x61,al
  mov al,0x0B6
  out 0x43,al
A99:
  mov al,bl
  out 0x42,al
  mov al,bh
  out 0x42,al
done:
ret
endp


section '.idata' import data readable writeable

  library kernel,'KERNEL32.DLL',\
          user,'USER32.DLL'

section '.edata' export data readable

  export 'PCLAUTSPR.DLL',\
          soundoff,'soundoff',\
          sound,'sound'

section '.reloc' fixups data discardable


Wie verwende ich die DLL jetzt für meine C/C++ programme??
Ich hab ja nur die *.dll !

Ich hab einfach von hand ne *.hpp - Datei geschrieben:

C++:
#ifndef pclautspr
#define pclautspr
void soundoff();
void sound(int freq);
#endif


und die *.dll hab ich mit LoadLibrary geladen (hab ja keine *.lib bzw *.a)
Aber ich bekomme immer den Linker-Error

Fehler:
[Linker error] undefined reference to `soundoff()'
[Linker error] undefined reference to `sound(int)'

--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.09.2005, 22:27 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


manuell laden wär ne möglichkeit, also über LoadLibrary. Ansonsten müsste es wahrscheinlich ne möglichkeit geben sich vom fasm auch ne lib generieren zu lassen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.09.2005, 07:33 Uhr
RedEagle




C++:
typedef int (*PROCEDURE)(LPTSTR);

int main()
{
  HINSTANCE hinstLib;
  PROCEDURE sound, soundoff;
  BOOL FreeResult, RunTimeLinkSuccess = FALSE;

    // Get a handle to the DLL module.

    hinstLib = LoadLibrary(TEXT("c:\\windows\\profiles\\ralf\\desktop\\pslautspr.dll"));
     // If the handle is valid, try to get the function address.
    if(hinstLib != NULL)
    {
     sound = (PROCEDURE) GetProcAddress(hinstLib, TEXT("sound"));
     // If the function address is valid, call the function.
     if(NULL != sound)
     {
      RunTimeLinkSuccess = TRUE;
      MessageBox(NULL,"\"sound()\" wurde geladen","",MB_OK|MB_ICONINFORMATION);
      //(sound) (300);
     }
     // Free the DLL module.
     FreeResult = FreeLibrary(hinstLib);
    }

    // If unable to call the DLL function, use an alternative.
    if(!RunTimeLinkSuccess) MessageBox(NULL,"\"sound()\" konnte nicht geladen werden","ERROR",MB_OK|MB_ICONSTOP);

//sound(300);
//Sleep(50);
//soundoff();

return 0;
}


Funktioniert leider auch nicht
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.09.2005, 08:18 Uhr
Tommix



'Morgen,
"funktioniert nicht" ist keine sehr hilfreiche Fehlerbeschreibung.
Wie auch immer, daß in und out unter Windows NT, XP usw. nur im privilegierten Modus laufen, ist Dir klar, oder?
Siehe:
www.fun-soft.de/showtopic.php?threadid=10072

- Tommix


Bearbeitung von Tommix:

Du nimmst auch für zwei Funktionen unterschiedlicher Signatur das gleiche typedef. Müßte es nicht

C++:
void (*sound)(int);
void (*soundoff)(void);
/*...*/
sound = (void(*)(int)) GetProcAddress(hinstLib, TEXT("sound"));
soundoff = (void(*)(void)) GetProcAddress(hinstLib, TEXT("soundoff"));


heißen?


Dieser Post wurde am 23.09.2005 um 08:30 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.09.2005, 14:02 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Denk dran, dass in C/C++ ein Funktionsname intern mit einem Unterstrich beginnt. Wenn Du im C-Quelltext "void soundoff();" schreibst, muss im Assemblerteil "proc _soundoff" stehen...
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.09.2005, 15:29 Uhr
RedEagle



Danke für die antworten, aber es funktioniert leider immer nocht nicht.
LoadLibrary läd die dll nicht -> GetLastError = 11 -> "Es wurde versucht, ein Programm im falschen Format zu laden."


Zitat von Bruder Leif:
Direkte Portzugriffe kannst Du vergessen. Unter 32Bit-Windoof ist ein gewöhnliches Programm von der Hardware abgekoppelt, Du DARFST nicht direkt drauf zugreifen. Sinn und Zweck ist einfach, das System stabiler zu machen. Wer dennoch direkt auf Ports zugreifen will, muß sich seinen eigenen Kernel-Mode-Treiber basteln...

mit anderen Worten: Wenn ich die Dll geladen habe, bringt es mir nichts, weil ich meine eigenen funktionen nicht benutzen darf!?!

@ Tommix: wie komme ich in den "privilegierten Modus"??
--
MFG RedEagle

Dieser Post wurde am 23.09.2005 um 15:33 Uhr von RedEagle editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.09.2005, 15:42 Uhr
Tommix




Zitat:

Wenn ich die Dll geladen habe, bringt es mir nichts, weil ich meine eigenen funktionen nicht benutzen darf!?!


So ist es. Aber für einen Assembler-Spezi dürfte die Programmierung eines Kernel-Treibers ein leichtes sein .
Die Bemerkungen von Leifus und mir helfen allerdings nicht, wenn schon das Laden nicht funzt. Da weiß ich aber auch nicht weiter. Ich hätte nicht gedacht, daß jemand eine DLL komplett in Assembler macht, aber viel Erfolg damit.

Gruß, Tommix


Bearbeitung:

Wenn ich wüßte, wie man zu Privilegien kommt...
Ich hab wirklich nicht viel Ahnung davon, aber aus dem User Mode kommst Du IMHO überhaupt nicht in den Privileged Mode. Du mußt einen Treiber schreiben. Such mal nach "DDK" im MSDN, falls es Dir das Wert ist.

- Tommix


Dieser Post wurde am 23.09.2005 um 15:46 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.09.2005, 15:48 Uhr
RedEagle




Zitat von Tommix:
So ist es. Aber für einen Assembler-Spezi dürfte die Programmierung eines Kernel-Treibers ein leichtes sein .
Die Bemerkungen von Leifus und mir helfen allerdings nicht, wenn schon das Laden nicht funzt. Da weiß ich aber auch nicht weiter. Ich hätte nicht gedacht, daß jemand eine DLL komplett in Assembler macht, aber viel Erfolg damit.

Gruß, Tommix


1. Ich bin kein Assembler-Spezi, sonder habe vor etwa 1 Woche erst damit angefangen
2. Die DLL-Struktur war vorgefertigt, und ich hab lediglich die "Demo-funktionen" gegen die Sound-Funktionen ersetzt

Ich will doch nur'n bischen sound haben!!!
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
23.09.2005, 16:03 Uhr
Tommix



Funktionieren denn die Demo-Funktionen, wenn Du sie nicht ersetzt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
23.09.2005, 16:11 Uhr
RedEagle



Die demo-dll kann ich laden...
Aber der ganze mist bringt mir ja nichts, wenn ich die Funktionen nicht verwenden kann

gibt es den absolut keine Möglichkeit, einen bestimmten ton, über diesen Lautsprecher auszugeben??
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ Assembler ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: