Avatar billede delphi Nybegynder
13. november 2000 - 12:35 Der er 19 kommentarer og
1 løsning

Convertering af C++ DLL function til Delphi 5

Hvorledes konverteres nedenstående MSVC++ 6 funktion til Delphi:

__declspec(dllexport) char* WINAPI FiPixelFormatStringA( FIREi_PIXEL_FORMAT a_PixelFormat );

Den overførte parameter (FIREi_PIXEL_FORMAT) har jeg styr på.  Rutinen, der skal kaldes, befinder sig i en DLL der hedder FIREi.DLL

Hvon\' hulen skal man egentligt forstå:

__declspec(dllexport)

og

WINAPI

Delphi
Avatar billede borrisholt Novice
13. november 2000 - 12:40 #1
__declspec(dllexport) betyder at funktoinen skal eksporteres ud af dll filen ...

det bliver til

function FiPixelFormatStringA( a_PixelFormat : FIREi_PIXEL_FORMAT ) : Pchar;stdcall; export;

i delphi !

Men hvorfor i alverden konvetere DLL filen .. Hvorfor ikke bare mappe den ind i din Delphi, ved at kalde funktionerne der nede i ..

Jens B
Avatar billede borrisholt Novice
13. november 2000 - 12:44 #2
Det kan da etenlig også godt være at det var det du spurgte om ...

så prøv det her
function FiPixelFormatStringA( a_PixelFormat : FIREi_PIXEL_FORMAT ) : Pchar; stdcall external \'FIREi.DLL\';

Avatar billede delphi Nybegynder
13. november 2000 - 12:46 #3
Jeg klodsede vist lidt i det (40 cm fejl):  Der skulle stå

__declspec(dllimport)

(Ikke export - lidt forvirrende, men klippe klister funktionen fik lige fat i den forerte linie.)

Jeg vil ikke konvertere DLL\'en.  Jeg har bare noget C++ kode jeg vil lave om til Delphi.  Hvordan skal jeg så skrive i mit Delphi interface for kunne kalde rutinerne i FIREi.DLL?

Delphi


PS: Jeg hader C++
Avatar billede borrisholt Novice
13. november 2000 - 12:51 #4
FRA MSDN :

DLL Import and Export Functions
Microsoft Specific —>

The dllimport and dllexport storage-class modifiers are Microsoft-specific extensions to the C language. These modifiers explicitly define the DLL’s interface to its client (the executable file or another DLL). Declaring functions as dllexport eliminates the need for a module-definition (.DEF) file. You can also use the dllimport and dllexport modifiers with data and objects.

The dllimport and dllexport storage-class modifiers must be used with the extended attribute syntax keyword, __declspec, as shown in this example:

#define DllImport  __declspec( dllimport )
#define DllExport  __declspec( dllexport )

DllExport void func();
DllExport int i = 10;
DllExport int j;
DllExport int n;

Jens B
Avatar billede delphi Nybegynder
13. november 2000 - 12:59 #5
Jamen Jens det bliver jeg bare ikke vildt meget klogere af (jeg har også prøvet at se i MSDN forvirr... øhh dokumentationen).  Jeg er bare stadig så ny i C++, at jeg ikke har tilstrækkeligt styr på begreber som \"storage-class modifiers\", \"module-definition (.DEF) file\" osv.

Peter
Avatar billede delphi Nybegynder
13. november 2000 - 12:59 #6
Du er vel nu med på, at jeg har en DLL indeholdende nogle rutiner jeg skal bruge.  Den eneste dolumentation jeg har er en C++ header fil, der beskriver funktionerne som fx:


#ifdef FIREiAPI_DLL_BUILD
#define FIREiAPI_DLL_SPEC __declspec(dllexport)
#else
#define FIREiAPI_DLL_SPEC __declspec(dllimport)
#endif

#define FIREiAPI(type) FIREiAPI_DLL_SPEC type


FIREiAPI(FIREi_STATUS) FiBusReset(
    IN      ULONG                      a_uAdapterNumber,
    IN      BOOLEAN                    a_bShortReset );


Hvilket kan læses som er det samme som:

__declspec(dllimport) FIREi_STATUS WINAPI FiBusReset(IN ULONG a_uAdapterNumber, IN BOOLEAN a_bShortReset);


Denne rutine og alle de andre i DLL\'en, ønsker jeg nu at kunne kalde fra Delphi og skal derfor ha\' skrevet mig en interface Unit.

Spørgsmålet er så: Hvorledes skal den se ud?  -  Med andre ord: Hvilket indvirkning har

__declspec(dllimport) og

WINAPI

på
Peter
Avatar billede delphi Nybegynder
13. november 2000 - 13:01 #7
på
Peter?? 

Elendigt tastatur! Der skulle stå:

på min Delphi code.

Peter
Avatar billede borrisholt Novice
13. november 2000 - 13:17 #8
Har du ingen MSDN ?
Avatar billede delphi Nybegynder
13. november 2000 - 13:20 #9
Jo jeg har MSDN, men den er efter min fattige mening ikke specielt god.  På dette felt er Delphis online hjælp LANGT bedre.  Bare så \"simpel en ting\" som eksempler er der meget lng imellem i MSDN hjælpen.

Svarer du så på mit spørgsmål eller skal du lokkes lidt mere :)

Peter
Avatar billede borrisholt Novice
13. november 2000 - 13:21 #10
smid lige det hele efter mig ...
Avatar billede delphi Nybegynder
13. november 2000 - 13:30 #11
Det er vel ikke nødvendigt at smide hele skidtet i hovedet på dig.  Problemet er vel ikke så stort:
Jeg regner med at min Delphi code skal se ud som noget i retning af:

Const
  DllName = \'FIREi.DLL\';

Function FiBusReset(AdapterNumber : LongWord; ShortReset : LongBool); external DllName;


Er det nok, eller skal der stå noget med \"stdcall\" eller \"ccall\" eller hur?

Peter
Avatar billede borrisholt Novice
13. november 2000 - 13:33 #12
Der skal i hvertfald stå StdCall; i det det er standard C++ kalle konvention ...

Ellers må du mappe den ind i hånden ...

Jens B
Avatar billede delphi Nybegynder
13. november 2000 - 13:38 #13
Hvad vil det sige?
Avatar billede borrisholt Novice
13. november 2000 - 13:42 #14
Const
  DllName = \'FIREi.DLL\';

Function FiBusReset(AdapterNumber : LongWord; ShortReset : LongBool); stdcall external DllName;

Hvad vil hvad sige ? En kalde konvention ? Eller hvad ?

En kalde konvention er i det her tilfælde et spørgsmål om hvilken rækkefølge som parameterne blver helt på stacken i og hvilke registere der indeholde hvilke parametre ...

Keyword Stack cleanup Parameter passing
__cdecl Caller Pushes parameters on the stack, in reverse order (right to left)
__stdcall Callee Pushes parameters on the stack, in reverse order (right to left)
__fastcall Callee Stored in registers, then pushed on stack
thiscall
(not a keyword) Callee Pushed on stack; this pointer stored in ECX



Jens B


Avatar billede delphi Nybegynder
13. november 2000 - 13:48 #15
Tak for hjælpen, jeg går hjem og prøver (mens jeg ser Robinson).

Delphi
Avatar billede delphi Nybegynder
13. november 2000 - 13:54 #16
På http://www.trsoft.de/freeware.html er jeg iøvrigt faldet over en C++ -> Delphi konverterings guide.  Den er lidt gammel og den dækker ikke det aktuelle problem, men ellers er den da meget god.

Er der nogen andre der har noget tilsvarende info?

Peter
Avatar billede borrisholt Novice
13. november 2000 - 14:56 #17
delphi >> Det software der er der inde er vist noget gammel noget .... Speciel deres CPU utils er til grin ...

Jens B
Avatar billede delphi Nybegynder
13. november 2000 - 15:00 #18
Dem så jeg slet ikke....  Jeg søgte på noget C++ -> Delphi convertering og fik et link til den guide.  Resten af sitet har jeg overhovedet slet ikke studeret...

Delphi
Avatar billede borrisholt Novice
14. november 2000 - 12:55 #19
Nå ja tak for det ... Hvor svært var det at få det til at virke ? Kunne du nøjeg med at mappe dem statisk eller hvad ?

Jens B
Avatar billede delphi Nybegynder
14. november 2000 - 13:47 #20
Jeg har ikke testet det endnu, men jeg har sendt en fil til dig - så kan du se.

Spændende at se om jeg nu har fået oversat tingene korrekt....

Peter
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester