Dll compiled with language fb won't work in fblite

General FreeBASIC programming questions.
lassar
Posts: 300
Joined: Jan 17, 2006 1:35
Contact:

Dll compiled with language fb won't work in fblite

Postby lassar » Jul 18, 2018 19:47

I got this code that is really bugging me.

Found out the only way scale2x would work was to compile in dialect "fb".

But I need to use it in dialect "fblite."

So I made a dll of scale2x using dialect "fb".

I can call scale2x from a program compiled using dialect "fb", and it works.

But when I call scale2x from a program compiled using dialect "fblite", it crashes.

I thought that it wouldn't matter, if a dll was created using "fb" OR "fblite".

What's going on here?


scale2xprogram.bas

Code: Select all


'#LANG "fblite"
#include "fbgfx.bi"

DECLARE SUB scale2x_32 LIB "scale2x.dll" (PTORG as any ptr, PTDST as any ptr)

DIM IMG AS ANY PTR
DIM ImageData AS ANY PTR

SCREENRES 1280,960, 32, 1,1
SETMOUSE 0,0,0 
 
IMG = ImageCreate(640, 480,,32)
BLOAD "Radtutor.bmp",IMG
 
ImageInfo IMG,,,,, ImageData
screenlock
Scale2x_32(ImageData,screenptr)
screenunlock

SLEEP
END




Scale2x.bas to make dll


Code: Select all

'#lang "fblite"
'#include "fbgfx.bi"
'Using FB

#define SC2X_X 640
#define SC2X_Y 480
#define MYBPP 32

declare sub scale2x_32(PTORG as any ptr, PTDST as any ptr)

sub scale2x_32(PTORG as any ptr, PTDST as any ptr) EXPORT


  static as integer Y 
  Y = SC2X_Y
 
  #define ESZ 4 
 
  const PILI = SC2X_X
  const PILIS = SC2X_X-1
  const OPI = ESZ
  const TPI = ESZ*2 
  const OLIS = (SC2X_X-1)*ESZ
  const OLIA = (SC2X_X+1)*ESZ
  const TLISS = ((SC2X_X*2)-2)*ESZ
  const TLIS = ((SC2X_X*2)-1)*ESZ
  const TLI = ((SC2X_X*2))*ESZ
  const TLIA = ((SC2X_X*2)+1)*ESZ
 
  ' **** Inicio do código asm fixo para dobrar 256x192 ****
  asm       
    mov ESI,[PTORG]     ' ESI = Ponteiro de Origem
    mov EDI,[PTDST]     ' EDI = Ponteiro de Destino
    lodsd               ' \
    stosd               ' | Copia e aumenta
    stosd               ' | o primeiro Pixel
    mov [EDI+TLISS],EAX   ' | (borda)
    mov [EDI+TLIS],EAX   ' /
    ' *************** Primeira Linha (borda) **************
    mov ECX,PILIS         ' (255 pixels na linha (256-borda))
    _FLNEXTPOINT_:      ' Label de Próximo Pixel
    lodsd                ' Carrega Pixel central (E)
    mov EBX,[ESI]        ' Carrega Pixel Superior (B)
    mov EDX,[ESI]        ' Carrega Pixel Direito (F)
    cmp EBX,[ESI+OLIS]    ' \ Compara igualdade dos pixels B & H
    je _FLBEHODEF_      ' | Iguais? Entom pula para escala normal
    cmp [ESI-TPI],EDX      ' | Compara igualgade dos pixels D & F
    je _FLBEHODEF_      ' / Iguais? Entom pula para escala normal
    ' ************ 4 pontos da escala especial ************
    cmp EBX,[ESI-TPI]      ' Compara Pixels B & D       \
    je _FLNOCHGE0_      ' iguais entom E0 = D        | iif(B=D,D,E)
    mov EBX,EAX           ' diferentes entom E0 = E    |
    _FLNOCHGE0_:        ' Label Qndo Iguais (ignora) /
    mov [EDI],EBX        ' Coloca ponto E0 (superior esquerdo) no buffer de destino
    cmp [ESI],EDX        ' Compara Pixels B & F       \
    je _FLNOCHGE1_      ' Iguais? entom E1=F         | iif(B=F,F,E)
    mov EDX,EAX           ' Diferentes? entom E1 = E   |
    _FLNOCHGE1_:        ' Label qndo iguais (ignora) /
    mov [EDI+OPI],EDX      ' Coloca ponto E1 (superior direito) no buffer de destino
    mov EBX,[ESI-TPI]      ' Carrega Pixel Esquerdo (D)
    mov EDX,[ESI+OLIS]    ' Carrega Pixel Inferior (H)
    cmp EBX,EDX           ' Compara Pixels H & D       \
    je _FLNOCHGE2_      ' Iguais? entom E2=D         | iif(H=D,D,E)
    mov EBX,EAX           ' Diferentes? entom E2=E     |
    _FLNOCHGE2_:        ' Label qndo iguais (ignora) /
    mov [EDI+TLI],EBX   ' Coloca ponto E2 (inferior esquerdo) no buffer de destino
    cmp EDX,[ESI]        ' Compara Pixels H & F       \
    je _FLNOCHGE3_      ' Iguais entom E3=F          | iif(H=F,F,E)
    mov EDX,EAX           ' Diferentes? entom E3=E     |
    _FLNOCHGE3_:        ' Label qndo iguais (ignora) /
    mov [EDI+TLIA],EDX   ' Coloca ponto E3 (inferior direito) no buffer de destino
    add EDI,TPI           ' Aponta para próximo pixel de destino
    dec ECX             ' \ Próximo pixel da linha
    jnz _FLNEXTPOINT_   ' / até que termine
    add EDI,TLI        ' Aponta para próxima linha de destino
    dec dword ptr [Y]   ' \ Próximo linha
    jnz _NEXTLINE_      ' / (adianta pq 1S linha = borda)
    ' ************ 4 pontos da escala normal ************
    _FLBEHODEF_:        ' Label para escala normal
    stosd               ' \
    stosd               ' | Coloca os 4 pontos no buffer de destino
    mov [EDI+TLISS],EAX   ' | E0,E1,E2,E3 ( = E (ponto central )
    mov [EDI+TLIS],EAX   ' /
    dec ECX             ' \ Próximo pixel da linha
    jnz _FLNEXTPOINT_   ' / até que termine   
    add EDI,TLI        ' Aponta para próxima linha de destino
    dec dword ptr [Y]   ' \ Próximo linha
    ' ***************** Linhas Seguintes *****************
    _NEXTLINE_:         ' Label de próxima linha
    mov ECX,PILI         ' 256 pixels (borda provisória)
    _NEXTPOINT_:        ' Label de Próximo Ponto
    lodsd               ' Carrega Pixel central (E)
    mov EBX,[ESI-OLIA]    ' Carrega Pixel Superior (B)
    mov EDX,[ESI]        ' Carrega Pixel Direito (F)
    cmp EBX,[ESI+OLIS]    ' \ Compara igualdade dos pixels B & H
    je _BEHODEF_        ' | Iguais? Entom pula para escala normal
    cmp [ESI-TPI],EDX      ' | Compara igualgade dos pixels D & F
    je _BEHODEF_        ' / Iguais? Entom pula para escala normal
    ' ************ 4 pontos da escala especial ************
    cmp EBX,[ESI-TPI]      ' Compara Pixels B & D       \
    je _NOCHGE0_        ' iguais entom E0 = D        | iif(B=D,D,E)
    mov EBX,EAX           ' diferentes entom E0 = E    |
    _NOCHGE0_:          ' Label Qndo Iguais (ignora) /
    mov [EDI],EBX        ' Coloca ponto E0 (superior esquerdo) no buffer de destino
    cmp [ESI-OLIA],EDX    ' Compara Pixels B & F       \
    je _NOCHGE1_        ' Iguais? entom E1=F         | iif(B=F,F,E)
    mov EDX,EAX           ' Diferentes? entom E1 = E   |
    _NOCHGE1_:          ' Label qndo iguais (ignora) /
    mov [EDI+OPI],EDX      ' Coloca ponto E1 (superior direito) no buffer de destino
    mov EBX,[ESI-TPI]      ' Carrega Pixel Esquerdo (D)
    mov EDX,[ESI+OLIS]    ' Carrega Pixel Inferior (H)
    cmp EBX,EDX           ' Compara Pixels H & D       \
    je _NOCHGE2_        ' Iguais? entom E2=D         | iif(H=D,D,E)
    mov EBX,EAX           ' Diferentes? entom E2 = E   |
    _NOCHGE2_:          ' Label qndo iguais (ignora) /
    mov [EDI+TLI],EBX   ' Coloca ponto E2 (inferior esquerdo) no buffer de destino
    cmp EDX,[ESI]        ' Compara Pixels H & F       \
    je _NOCHGE3_        ' Iguais entom E3=F          | iif(H=F,F,E)
    mov EDX,EAX           ' Diferentes? entom E3 = E   |
    _NOCHGE3_:          ' Label qndo iguais (ignora) /
    mov [EDI+TLIA],EDX   ' Coloca ponto E3 (inferior direito) no buffer de destino
    add EDI,TPI           ' Aponta para próximo pixel de destino
    dec ECX             ' \ Próximo pixel da linha
    jnz _NEXTPOINT_     ' / até que termine
    add EDI,TLI        ' Aponta para próxima linha de destino
    dec dword ptr [Y]   ' \ Próxima linha
    jnz _NEXTLINE_      ' / das 191 restantes (menos borda)
    jmp _FINALEND_      ' Vai para o fim caso termine com escala especial
    ' ************ 4 pontos da escala normal ************
    _BEHODEF_:          ' Label de Escala Normal
    stosd               ' \
    stosd               ' | Coloca os 4 pontos no buffer de destino
    mov [EDI+TLISS],EAX   ' | E0,E1,E2,E3 ( = E (ponto central )
    mov [EDI+TLIS],EAX   ' /
    dec ECX             ' \ Próximo pixel da linha
    jnz _NEXTPOINT_     ' / até que termine
    add EDI,TLI        ' Aponta para próxima linha de destino
    dec dword ptr [Y]   ' \ Próxima linha
    jnz _NEXTLINE_      ' / das 191 restantes (menos borda)
    _FINALEND_:         ' Label de fim =)
  end asm 
end sub

lassar
Posts: 300
Joined: Jan 17, 2006 1:35
Contact:

Re: Dll compiled with language fb won't work in fblite

Postby lassar » Jul 18, 2018 19:59

Never mind. Just figured it out.

I needed to change the declare in scale2xprogram.bas

From

Code: Select all

DECLARE SUB scale2x_32 LIB "scale2x.dll" (PTORG as any ptr, PTDST as any ptr)


TO

Code: Select all

DECLARE SUB scale2x_32 LIB "scale2x.dll" (byval PTORG as any ptr, byval PTDST as any ptr)
fxm
Posts: 9306
Joined: Apr 22, 2009 12:46
Location: Paris suburbs, FRANCE

Re: Dll compiled with language fb won't work in fblite

Postby fxm » Jul 18, 2018 21:00

- In the -lang fb dialect, ByVal is the default parameter passing convention for all built-in types except String and user-defined Type which are passed ByRef by default.
- In -lang qb and -lang fblite dialects, ByRef is the default parameter passing convention.

Return to “General”

Who is online

Users browsing this forum: No registered users and 2 guests