Página 1 de 1

Alguém com GPF ao usar objetos?

Enviado: 31 Dez 2013 12:17
por JoséQuintas
Fiz uma descoberta meio esquisita, e já postei lá nos desenvolvedores:

ao usar uma variábel estática para a conexão MySql, eu tenho GPF ao sair do sistema.
Consegui resolver alterando o conteúdo da variável da conexão antes de sair.

Tipo:

Código: Selecionar todos

cnConexao := "any"
RETURN
Como comentário adicional, no VB é necessário algo especial no encerramento de variáveis objecto.

No VB6 tinha que usar SET CN = Nothing (algo como variavel = NIL )
E no VB.NET: cn.Dispose()

Se alguém estiver tendo GPF no sistema ao usar algum controle/dll externo, poderia fazer o teste pra confirmar se resolve.

Alguém com GPF ao usar objetos?

Enviado: 31 Dez 2013 21:24
por marcosgambeta
José,

Está usando ADO na conexão com o MySQL ou algum outro recurso do Harbour ?

Alguém com GPF ao usar objetos?

Enviado: 01 Jan 2014 04:58
por JoséQuintas
Isto:

cn := win_OleCreateObject("ADODB.Connection")

Se a variável for estática, precisa zerar o conteúdo antes de encerrar o sistema.

pode ser: cn := "any"

Alguém com GPF ao usar objetos?

Enviado: 01 Jan 2014 05:27
por JoséQuintas
O teste prático:

Código: Selecionar todos

PROCEDURE Main
   LOCAL x
   x := MySqlConnection()
   ? ValType( X )
   ? ValType( MySqlConnection() )
   ? "AppcnMySql() is type " + ValType( AppcnMySql() )
   AppcnMySql( "any" )
   RETURN
   
FUNCTION AppCnMySql( xValue )
   STATIC AppcnMySql 
   IF ValType( AppcnMySql ) != "O"
      AppcnMySql := MySqlConnection()
   ENDIF
   IF xValue != NIL
      AppcnMySql := xValue
   ENDIF
   RETURN AppcnMySql

FUNCTION MySqlConnection()
   LOCAL ocn
   ocn := win_OleCreateObject( "ADODB.Connection" )
   ocn:ConnectionString := "Driver={MySql ODBC 3.51 Driver};Server=xserver;Option=131072;Stmt=;" + ;
      "Database=jpatecnologia;User ID=xuser;Password=xpassword;"
   ocn:CursorLocation    := 3 // cliente
   ocn:CommandTimeOut    := 30 // seconds
   ocn:ConnectionTimeOut := 30 // seconds
   RETURN ocn
Primeiro compilado do jeito que está:

Código: Selecionar todos

d:\testes\ado>hbmk2 test
Harbour 3.2.0dev (r1312270146)
Copyright (c) 1999-2013, http://harbour-project.org/
Compiling 'test.prg'...
Lines 28, Functions/Procedures 3
Generating C source output to 'd:\temp\hbmk_bmn2yk.dir\test.c'... Done.

d:\testes\ado>test

O
O
AppcnMySql() is type O
d:\testes\ado>
Agora bloqueando a linha que altera do conteúdo da variável antes de sair:
// AppcnMySql( "any" )

Código: Selecionar todos

d:\testes\ado>hbmk2 test
Harbour 3.2.0dev (r1312270146)
Copyright (c) 1999-2013, http://harbour-project.org/
Compiling 'test.prg'...
Lines 28, Functions/Procedures 3
Generating C source output to 'd:\temp\hbmk_0b8npw.dir\test.c'... Done.

d:\testes\ado>test

O
O
AppcnMySql() is type O
Unrecoverable error 6005: Exception error:

    Exception Code:C0000005
    Exception Address:004015CD
    EAX:00000000  EBX:003B41E4  ECX:0033188C  EDX:00331F0C
    ESI:02352720  EDI:003B423C  EBP:00000001
    CS:EIP:0023:004015CD  SS:ESP:002B:0028FE10
    DS:002B  ES:002B  FS:0053  GS:002B
    Flags:00010246
    CS:EIP: 8B 06 89 34 24 FF 50 08 83 EC 04 83 C4 14 5B 5E
    SS:ESP: 00000000 0036B648 FFFFFFFE 00411F2B 00000002 003B41E4 003B41D4 004193B5 003B41E4 0036D4C8 00000030 00411F2B
00000000 003B4224 00000001 00456789

    C stack:
    EIP:     EBP:       Frame: OldEBP, RetAddr, Params...

Modules:
0x00400000 0x0014C000 d:\testes\ado\test.exe
0x770D0000 0x00180000 C:\Windows\SysWOW64\ntdll.dll
0x76090000 0x00110000 C:\Windows\syswow64\kernel32.dll
0x757E0000 0x00047000 C:\Windows\syswow64\KERNELBASE.dll
0x764F0000 0x000AC000 C:\Windows\syswow64\msvcrt.dll
0x74840000 0x0015C000 C:\Windows\syswow64\OLE32.dll
0x75B30000 0x00090000 C:\Windows\syswow64\GDI32.dll
0x75970000 0x00100000 C:\Windows\syswow64\USER32.dll
0x762C0000 0x000A0000 C:\Windows\syswow64\ADVAPI32.dll
0x75950000 0x00019000 C:\Windows\SysWOW64\sechost.dll
0x75F30000 0x000F0000 C:\Windows\syswow64\RPCRT4.dll
0x747B0000 0x00060000 C:\Windows\syswow64\SspiCli.dll
0x747A0000 0x0000C000 C:\Windows\syswow64\CRYPTBASE.dll
0x770A0000 0x0000A000 C:\Windows\syswow64\LPK.dll
0x763A0000 0x0009D000 C:\Windows\syswow64\USP10.dll
0x75A70000 0x0008F000 C:\Windows\syswow64\OLEAUT32.DLL
0x765A0000 0x00060000 C:\Windows\system32\IMM32.DLL
0x74A30000 0x000CC000 C:\Windows\syswow64\MSCTF.dll
0x72950000 0x00080000 C:\Windows\system32\uxtheme.dll
0x749A0000 0x00083000 C:\Windows\syswow64\CLBCatQ.DLL
0x73710000 0x00016000 C:\Windows\system32\CRYPTSP.dll
0x736D0000 0x0003B000 C:\Windows\system32\rsaenh.dll
0x70B80000 0x0000E000 C:\Windows\system32\RpcRtRemote.dll


d:\testes\ado>

Alguém com GPF ao usar objetos?

Enviado: 02 Jan 2014 16:28
por marcosgambeta
José,

Vi na lista de desenvolvimento do Harbour que o erro foi corrigido. Bom para todo mundo. É por isto que é importante relatar qualquer comportamento estranho no uso do Harbour ou, pelo menos, tentar identificar a causa do problema. Pode ser um erro do desenvolvedor, um erro da ferramenta externa ou mesmo um erro no Harbour.

Recentemente, andei fazendo muitos testes com ADO + Access (.mdb e .accdb) e Firebird. Mas como não usei variáveis STATIC, não tive problemas de GPF. Já no seu caso, o problema apareceu.

Parabéns pela atitude. Somente assim teremos um Harbour cada vez mais estável e robusto.

Alguém com GPF ao usar objetos?

Enviado: 02 Jan 2014 16:41
por Itamar M. Lins Jr.
2014-01-02 18:41 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* src/vm/hvm.c
* clear STATIC variables before releasing thread specific data.
It should resolve potential problems with code using TSD to activate
cleanup procedure and later cannot correctly execute pointer item
destructors, i.e. OLE subsystem.

best regards
Przemek

Alguém com GPF ao usar objetos?

Enviado: 02 Jan 2014 18:01
por JoséQuintas
Vi essa atualização de hoje.
Já baixei, testei e não tem mais GPF.