webForumDet fria alternativet

Lyckas inte med dll:er

Programmeringur Programmering - Övrigt

11 svar · 397 visningar · startad av Alpha II

Medlem sedan maj 20002 993 inlägg
Frågan#1

Jag försöker att skapa en dll fil med c++ och ett program som använder den i delphi.

Men när jag startar det får jag meddelandet:

"Det går inte att hitta procedurstartadressen muli i DLL-filen CALC.DLL"

Så här ser koden ut till CALC.DLL

__declspec(dllexport) float multi(float f1, float f2)
{
	return f1 * f2;
}

och så här försöker jag 'ladda' funktionen i delphi:

  function multi(f1, f2 : double): double; external 'CALC.DLL';
Medlem sedan aug. 2001458 inlägg
#2

Använd Dependency Walker för att kontrollera att funktionen verkligen är exporterad i din dll.

Medlem sedan maj 20002 993 inlägg
#3

Hmmm
vet inte själv, men det verkar som om de är exporterade eller?

I rutan längst ner står det:

"Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module."

och i en ruta står detta: (och lite mer värden i en lista):

@add$qff
@sub$qff
@multi$qff
@div$qff
___CPPdebugHook

Fö har Wf en dum spärr på att bifogade bilder inte får vara större än 600x1200 :o

Medlem sedan juni 20022 599 inlägg
#4

Som jag skrev i din förra tråd så beror ditt problem eventuellt på sk "name mangling" vilket innebär att funktionen inte exporteras som multi utan kanske som _multi@8 eller nåt liknande ..

För att lösa detta kan du lägga till en DEF-fil i ditt dll-projekt. Läs mer: http://www.webforum.nu/showthread.php?s=&threadid=62750

Ett annat sätt är att lägga till ett länkardirektiv i din kod (som jag tyvärr inte kommer ihåg).

pragma comment( linker, EXPORT:multi .. ??

Medlem sedan aug. 2001458 inlägg
#5

Ja, det ser absolut ut som funktionsnamnet är manglat. Lägg dit en def-fil som Niko förelår så borde det stå "multi" istället för "@multi$qff".

Medlem sedan maj 20002 993 inlägg
#6

Men hur lägger jag till en def fil till BCC?

Medlem sedan maj 20002 993 inlägg
#7

Skulle fortfarande vilja veta hur man gör det i BCC.
Jag testade att göra vet i MSVC och det verkar fungera.
Programmet laddar men resultatet blir alltid 0. Varför?
Har jag deklarerat något fel i delphi?

Medlem sedan aug. 2001458 inlägg
#8

Om du lyckas anropa funktionen i dll:en från ditt program gjort i delphi till men resultat blir fel är det förmodligen fel calling convention. Det finns olika calling conventions, och med det menas hur argument till funktioner och returvärden hanteras (i vilken ordning de ska läggas på stacken alternativt i CPU-register).

Delphi-programmet, om jag minns rätt, använder __fastcall som calling convention, och lägger de två första argumenten i register. Din dll antar förmodligen att argumenten ligger på stacken. Det borde finnas något sätt i delphi att berätta vad som gäller, titta i hjälpen på "export", som verkar vara sättet du importar funktioner på.

Läs mer i Bugslayer 0698 eller MSDN.

Medlem sedan maj 20002 993 inlägg
#9

Jag ändrade funktionen multi från att använda float till int. Och nu fungerar det!!! :D

Är inte double i delphi samma sak som float i c? Hur ska jag deklarera en funktion som använder floats isf i delphi??

Medlem sedan juni 2000350 inlägg
#10

Använd Single på delphi sidan om du använder float.

Mer hittar du här titta på "Type Conversion":
http://www.drbob42.com/delphi/headconv.htm

Oftast brukar man använda StdCall på delphi sidan (ang developers inlägg ovan).
function multi(f1, f2 : single): single; stdcall; external 'CALC.DLL';

Calling conventions
Directive / Parameter order / Clean-up / Passes parameters in registers?
register / Left-to-right / Routine / Yes
pascal / Left-to-right / Routine / No
cdecl / Right-to-left / Caller / No
stdcall / Right-to-left / Routine / No
safecall/ Right-to-left / Routine / No

Medlem sedan okt. 20013 217 inlägg
#11

Är det inte lättare att göra en COM-komponent som implementerar metoderna add, sub, multi och diff och sedan använda den från Delphi ?

Medlem sedan maj 20002 993 inlägg
#12

*har ingen aning om vad ett COM-komponent är*

133 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)