Entrar
¿Nuevo usuario? Inscribirme
smalltalking · Un lugar para el estudio y desarrollo de Ambientes de Objetos virtuales.
? ¿Ya estás suscrito? Entra a Yahoo!

Consejos

¿Sabías que...?
Podés cambiar el orden de los mensajes. Simplemente hacé clic en el enlace de columna fecha. Tus preferencias se guardarán, por lo tanto no necesitarás hacerlo otra vez cuando vuelvas a entrar.

Mensajes

  Mensajes Ayuda
Avanzado
VS: Pasando structuras a una DLL   Lista de mensajes  
Responder | Reenviar Mensaje #16927 de 17205 |
Re: [objetos] VS: Pasando structuras a una DLL

Hola Ale
 
Si los nombres estan mangueados. jaja.
Pero solo por la convención que usan, que es __stdcall, segun leí en la pagina de microsoft, las funciones   que usan esta convencion se decoran como '_xxxx@unNumero'  donde el numero es el numero de bytes que ocupan los parametros de la funcion.
 
Yo implemete un función de reemplazo para la que me da problemas en el mismo archivo cpp y h. Esta funciona perfecto, y lo único que cambie es esto:
Esta es la original:
 
JETAPI jeVec3d JETCC jeBrush_FaceGetWorldSpaceVertByIndex(
const jeBrush_Face *Face, int32 Index)
{
jeVec3d Vert;
assert(Face);
assert(Index < JE_INDEXPOLY_MAX_VERTS);
Vert = *jeVertArray_GetVertByIndex(Face->Brush->VertArray, Face->Poly->Verts[Index]);
jeXForm3d_Transform(&Face->Brush->XForm, &Vert, &Vert);
return Vert;
}
 
Esta es mi versión:
 
 
JETAPI
void JETCC jeBrushFaceGetWorldSpaceVertByIndex(const jeBrush_Face *Face, int32 Index, jeVec3d * V)
{
jeVec3d Vert;
assert(Face);
assert(Index < JE_INDEXPOLY_MAX_VERTS);
Vert = *jeVertArray_GetVertByIndex(Face->Brush->VertArray, Face->Poly->Verts[Index]);
jeXForm3d_Transform(&Face->Brush->XForm, &Vert, &Vert);
*V= Vert;
}
 
La diferencia es muy poca y esta anda de 10.
 
 
saludos kiko


--- El jue 15-ene-09, Alejandro F. Reimondo <aleReimondo@...> escribió:
De: Alejandro F. Reimondo <aleReimondo@...>
Asunto: Re: [objetos] VS: Pasando structuras a una DLL
Para: smalltalking@...
Fecha: jueves, 15 de enero de 2009, 10:17 pm


La DLL que ellos distribuyen tiene los nombres mangleados?
Creo que estas usando funciones de C++ y no la interfaz C...
(si definis el metodo api conun argumento mas al comienzo,
 al debugear en C la funcion que usas... ves bien los argumentos?)
Ale.
----- Original Message -----
Sent: Tuesday, January 13, 2009 12:44 PM
Subject: Re: [objetos] VS: Pasando structuras a una DLL

Hola Ale, gente
 
Bueno, paradoxnj desarrollador de Jet3D respondio a lo que me interesaba saber.
 
Yes. Jet3D is a standard C DLL (same as Genesis).
 
Con lo que queda claro que se puede usar desde cualquier ST.
Ahora me queda lo mas dificil, saber porque diablos tengo esos problemas con la librería
 
saludos kiko
 


--- El lun 12-ene-09, kikoGregoris <kikogregoris@ yahoo.com. ar> escribió:
De: kikoGregoris <kikogregoris@ yahoo.com. ar>
Asunto: Re: [objetos] VS: Pasando structuras a una DLL
Para: smalltalking@ gruposyahoo. com.ar
Fecha: lunes, 12 de enero de 2009, 2:08 pm

Hola Ale
 
Gracias eternamente jajajja, espero poder retribuir algún día.
 
Es tan dificil/caro ayudar así como producir usando
un lenguaje sin compilar.
 
Si, me queda muy claro y por eso no pretendo nada.Estoy recaliente jajaja, solo porque me tengo que topar con estas cosas locas. Si lo hubiera querido, estoy seguro que no lo hubiera conseguido.
 
Si, en muchos lugares solo apoyan el uso de herramientas de bajo nivel.
Es triste que además las usen para resolver aplicaciones. .. la percepción
de costos de producción y el éxito son siempre subjetivos.

 
Esto es lo que me contestaron hoy, tal vez nos quite la duda de que es realmente Jet3D.
 
 
The return value for the second one is constant. In addition, the first one has a calling convention of _stdcall instead of _cdecl (JETCC). You can find these types in BaseType.h. Check out that file and it will explain a lot.

Jet3D is a standard Windows DLL.
 
Pregunta obligada: Esto es optimo para usar desde ST ?.
Es lo mismo que decir libreria estandar C ?
Disculpa la pregunta boba, pero no estoy seguro.
 
 
A que lista te referís?
Creo que pocas personas podrán ayudarte leyendo el mail...
Es mas facil encontrar una escusa (por ejemplo que es smalltalk,
o que es visual smalltalk, etc) y protejer el ego :-)

>Seguramente es por las vacaciones que no hay nadie
jajaja! por las vacaciones?
yo diría que es por el frio! creo que la mayoría de la gente
que podría ayudarte está bajo nieve en estos días...
y quizás sin gas.
 
Quisiera creer que no es así, pero vos tenes mucha historia como para poder afirmarlo.
 
Saludos kiko


--- El sáb 10-ene-09, Alejandro F. Reimondo <aleReimondo@ smalltalking. net> escribió:
De: Alejandro F. Reimondo <aleReimondo@ smalltalking. net>
Asunto: Re: [objetos] VS: Pasando structuras a una DLL
Para: smalltalking@ gruposyahoo. com.ar
Fecha: sábado, 10 de enero de 2009, 11:32 am

Hola kiko,

>Gracias, se que estas ocupado y no te hagas drama.

jajaja! bienvenido el Sábado! releí un poco tus emails
y creo que puedo darte algunas ideas mas...
Igualmente, es muy dificil ayudar viendo código fuente;
y no pudiendo hacer un doIt.
Es tan dificil/caro ayudar así como producir usando
un lenguaje sin compilar.

>Ya me inscribí a lista de VS y mande una consulta.

Fijate también en la lista histórica,
http://www.listserv .dfn.de/archives /vswe-l.html

>Tambien pregunte en el foro de Jet3d http://apps. sourcefor
>ge.net/phpbb/ jetpp/viewtopic. php?f=6&t= 19&sid
>=5e782bf5b72568e49 22a9b4bc32428ff por si alguien quiere mirar
>No es mucha la ayuda insiste en decirme que no apollan smalltalk. jjaja

Si, en muchos lugares solo apoyan el uso de herramientas de bajo nivel.
Es triste que además las usen para resolver aplicaciones. .. la percepción
de costos de producción y el éxito son siempre subjetivos.

>Pero seguramente debe haber mas gente trabajando en Vs en la lista ??.

A que lista te referís?
Creo que pocas personas podrán ayudarte leyendo el mail...
Es mas facil encontrar una escusa (por ejemplo que es smalltalk,
o que es visual smalltalk, etc) y protejer el ego :-)

>Seguramente es por las vacaciones que no hay nadie
jajaja! por las vacaciones?
yo diría que es por el frio! creo que la mayoría de la gente
que podría ayudarte está bajo nieve en estos días...
y quizás sin gas.

Bueno, volviendo a lo técnico....

Veo que tenes definida en la librería:
>JETAPI const jeVec3d * JETCC jeBrush_FaceGetVert ByIndex(const jeBrush_Face
>*Face, int32 Index)
>{...}

Y que en Smalltalk tenes:
>JetDLL>>jeBrushFac eGetVertByIndex: pJetBrushFace index: pIndex
> <api: '_jeBrush_FaceGetVe rtByIndex@ 8' ulong ulong ulongReturn>
> ^self invalidArgument

Para entender qué define la función en C es necesario saber cómo estan
definidas las macros JETAPI, JETCCC que son parte de la parafernalia
que se requiere para hacer algo "decorosamente" en Cpuspus.
(Se que las pasaste por mail... lo digo para que estes seguro de que es
lo que definen.. y que es <api: lo que corresponde)

Pero MAS IMPORTANTE AÚN es necesario saber
dónde está definida la función!!!
Según sospecho esta definida en una clase C++ y eso NO es una fución C!!!

Sospecho que el problema puede ser que la funcion que estas usando es una
funcion (C++) de una clase y por eso esta mangleada.
De ser así, podrías jakearlo del lado del smalltalk agregando un (primer)
parámetro, que sería el receptor del "mensaje" (mensaje que nunca se
envía en C++)...
NO te recomiendo hacerlo de esa forma (auqneu así seguramente te exlicarás
el porque los argumentos son basura... estan desplazados :-) porque
además debes fijarte si es correcto definir los métodos como <api: o <c:
...
etc...

Si la función que estas usando fuera una función C no debería estar
mangleada,
es decir, si esta definida como jeBrush_FaceGetVert ByIndex(. .)
el literal a usar en smalltalk DEBE ser 'jeBrush_FaceGetVer tByIndex'

Para verificar esto hace lo siguiente:
1.- asegurate de tener en el path bien instaladas las herramientas de
cpuspus
y compila nuevamente la DLL.
2.- hace un dump de la dll generada en un archivo de texto con algo asi:
------------ --dumpDLL. bat------ --------- -------
c:

cd \ARCHIV~1\MICROS~ 2\VC98\BIN\

set
PATH=D:\ARCHIV~ 1\MICROS~ 2\COMMON\ MSDEV98\BIN; D:\ARCHIV~ 1\MICROS~ 2\VC98\BIN; D:\ARCHIV~ 1\MICROS~ 2\COMMON\ TOOLS\WIN95; D:\ARCHIV~ 1\MICROS~ 2\COMMON\ TOOLS;%PATH%

DUMPBIN /exports d:\Jet3D\Smalltalk\ miDLL.dll >d:\Jet3D\Smalltalk \miDLL.TXT

------------ --------- --------- --------- --------- --
3.- en el TXT fijate las funciones que estan exportadas, a modo de ejemplo
te copio un pedazo de un txt de otro proyecto, pero que creo te servirá por
analogía:
------------ --------- --------- --------- --------- --
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

Dump of file d:\OpenCV1\Smalltal k\cv100d. dll
File Type: DLL

Section contains the following exports for cv100d.dll
............ ......... ......... ......... .....
461 number of functions
461 number of names

ordinal hint RVA name

1 0 000CC270 ??0CvBaseImageFilte r@@QAE@ABV0@ @Z
............ ......... ......... ......... ......... ......... ..
165 A4 000CBE10 ?type@CvMatrix@ @QBEHXZ
166 A5 000CAEA0 ?width@CvImage@ @QBEHXZ
167 A6 00039111 cv2DRotationMatrix
168 A7 000C2853 cvAcc
............ ......... ......... ......... ......... ......... ......... .
457 1C8 000C9516 stcvThreshold
458 1C9 000C9185 stcvUpdateMotionHis tory
459 1CA 000C9BE7 stcvWarpAffine
460 1CB 000C9C1E stcvWarpPerspective
461 1CC 000C9B50 stcvXorS

Summary

31000 .data
8000 .rdata
6000 .reloc
1000 .rsrc
CD000 .text
------------ --------- --------- --------- --------- --

4.- fijate que las funciones de arriba están mangleadas, son
exportadas porque el binding de runtime de C++ las necesita;
ero no son las que deberías usar.
Adeás de tenes exportadas funciones mangleadas, debes tener
exportadas funciones C stabdard, sin manglear (sin caracteres ? _ ni @)

5.- si no es así, debes escribir (es recomendable que lo hagas)
en C funciones wrappers para exponar la API de la libreria en C.

Normalmente es una tarea muy simple en C y.... si no la hace el que
escribe la librería es porque no quiere hacerlo (no quiere exponer
la funcionalidad de una forma standard y abierta), como creo que
es el caso de Jet3D (fijate que es lo que estan diciendote.. .
yo creo que deberías escupirlos y decirles que vas a usar otra librería,
sino van a seguri pensando que estan haciendo algo abierto, por el solo
hecho de publicar los fuentes).

Volviendo a lo práctico...
un afunción C++ no te serviría salvo que quieras jakearla, para eso
deberías definir, como te decía, un primer argumento (que es el
componente Cpuspus, el "this") de forma explisita, pues ese argumentos
esta implisito en el lenguaje C++.
Además deberías crear un objeto (que seguro ya lo tenes) del lado de
smalltalk
que tenga ese puntero y además necesitas uan forma de instanciarlo. ..
Para instanciar dicho objeto puede ocurrir que:
1.- tengas una funcion ya escrita en la librería que devuelva un puntero
a dicha instancia (te devuelvela dirección del componente y eso es lo que
guardas en tu objeto smalltalk, pasandolo luego como "self asParameter"
como ese argumento que te falta)
2.- tengas que hacerte en la librería una funcion C que devuelva
una nueva instancia.

OOPPPPPSSS!! !
ahora, leyendo nuevamente tu email, veo que estas usandola de
la forma que note recomendaba :-)
ok.. entonces tené cuidado porque apenas algo este "medio mal"
te va a explotar todo :-)

Releyendo... vos decias....
>Esta es una función de Jet3D
>JETAPI const jeVec3d * JETCC jeBrush_FaceGetVert ByIndex
> (const jeBrush_Face *Face, int32 Index)
....
>JetDLL>>jeBrushFac eGetVertByIndex: pJetBrushFace index: pIndex
> <api: '_jeBrush_FaceGetVe rtByIndex@ 8' ulong ulong ulongReturn>
....
>OK
....
>JetDLL>>jeBrushFac eSetVertByIndex: pJetBrushFace index: pIndex vertex:
>pJetVertex
> <api: '_jeBrush_FaceSetVe rtByIndex@ 12' ulong ulong struct none>
....
>Ocurre que en la DLL el valor de vertex es basura !!!!!!!!!!!! !!.
>Ahora si yo modifico el tipo de parametro de STRUCT a ULONG
> el valor es correcto !!!!!!!!!!!! !.

Omitiste colocar la definicion en Cpuspus de la función SetVertByIndex. ..
(o yo no la encontré... asumo que el argumento pJetVertex es un puntero a un
vertex)

>Pero el tipo debería ser un STRUCT pues es un SelfDefinedStructur e
>!!!!!!!!!!.

No. El argumento es un puntero, luego debe ser
definido como un ulong (el puntero es lo que pasas,
no toda la estructura.. . que copiaría su contenido a otro lado)

>De otra manera si yo instanciara desde ST un JetVertex, al intentar
> pasarlo a la DLL me diría que espera un ULONG !!!!!!!!!!.

Cuando te dice que espera un argumento definido de otra forma es
que fallo la api porque los objetos que entraron en los argumentos
no conforman la definición del método API, aún no salió de smalltalk...
Es independiente de cómo sea la función en C en la librería.
Si llega del lado de C mal, puede explotar pero no se chequea nada...

>Que tiene que ver el tipo de retorno CONST en la función ?.

Creo que nada (no deberías estar accediendo via Cpuspus
sino via una API expuesta en C)

>Puede ser un problema para ST que se declare así es tipo de retorno ???.

jajaja... el problema podía ser si "no retorna" jajaja

>Puede ser un bug en la VM de ST ?.

No. Creo que es mal entendimiento de parte tuyo de cómo definir
una API en el caso que se te presenta ahora (que es un hacking
y no un acceso a una funcion C standard)
Lo seguro y decoroso es que quien hace la libreria haga su
trabajo como corresponda y exponga una interfaz standard.
Si no lo hace... yo no montaría mis esarrollos usando la librería
o pagaría el precio de escribir la interfáz (agregando funciones
estupidas del lado de C, como lo hace la gente que "trabaja
bien" en esas herramientas) .

>O por el contrario es un comportamiento habitual ?.

Es habitual que uno se equivoque en situaciones de hacking;
pero cuando le encontrás la vuelta luego siempre anda...
es la unica ventaja de lo que "no puede cambiar" :-P

>Se entiende el dilema ? jajaj

suerte! espero te sirva mi larrrrrgo email
Ale.




Yahoo! Cocina
Recetas prácticas y comida saludable
Visitá http://ar.mujer. yahoo.com/ cocina/



Yahoo! Cocina
Recetas prácticas y comida saludable
Visitá http://ar.mujer. yahoo.com/ cocina/



Yahoo! Cocina
Recetas prácticas y comida saludable
Visitá http://ar.mujer.yahoo.com/cocina/


Lun, 19 de Ene, 2009 12:15 pm

kikogregoris
Sin conexión Sin conexión
Enviar correo Enviar correo

Reenviar Mensaje #16927 de 17205 |
Desplegar mensajes Autor Ordenar por fecha

Hola Gente   Bueno estoy con un problema con las llamadas a funciones de Jet3D. El tema es que segun la forma de obtener un estructura desde la DLL, ocurre...
kikogregoris
Sin conexión Enviar correo
7 de Ene, 2009
12:18 pm

Hola Gente   Definitivamente hay algo que no anda bien.Esto es realmente extraño.   Cuando llamo a una función desde ST los argumentos dentro de la DLL...
kikogregoris
Sin conexión Enviar correo
7 de Ene, 2009
8:14 pm

Hola Gente   Me olvide de adjuntar las capturas jajaj.   saludos kiko ... De: kikoGregoris <kikogregoris@...> Asunto: Re: [objetos] VS: Pasando...
kikogregoris
Sin conexión Enviar correo
7 de Ene, 2009
10:46 pm

kiko, No se de que lado será el problema. Del lado de Smalltalk, te recomendaría revisar las definiciones de los métodos API LUEGO de leer nuevamente el...
Alejandro F. Reimondo
alereimondo
Sin conexión Enviar correo
7 de Ene, 2009
10:59 pm

kiko, Asegurate de estar usando la DLL que compilaste (que debe ser compilada en modo debug). Como recomendación práctica te diría que elimines toda copia...
Alejandro F. Reimondo
alereimondo
Sin conexión Enviar correo
7 de Ene, 2009
11:16 pm

Hola Ale   Gracias por la ayuda, de lo que me comentas ya lo he intentado casi todo, excepto que no entendí lo del dumps. A que te referis ?   Teneme...
kikogregoris
Sin conexión Enviar correo
8 de Ene, 2009
10:29 pm

kiko, Leí por arriba lo que mandaste, tengo paciencia, pero no tiempo como para leerlo todo; creo que no estas entendiendo bien como se definen los tipos de...
Alejandro F. Reimondo
alereimondo
Sin conexión Enviar correo
9 de Ene, 2009
12:23 pm

Hola Ale   Gracias, se que estas ocupado y no te hagas drama. Ya me inscribí a lista de VS y mande una consulta. Tambien pregunte en el foro de Jet3d ...
kikogregoris
Sin conexión Enviar correo
9 de Ene, 2009
10:55 pm

Hola kiko, ... jajaja! bienvenido el Sábado! releí un poco tus emails y creo que puedo darte algunas ideas mas... Igualmente, es muy dificil ayudar viendo...
Alejandro F. Reimondo
alereimondo
Sin conexión Enviar correo
10 de Ene, 2009
1:34 pm

Hola Ale   Gracias eternamente jajajja, espero poder retribuir algún día.   Es tan dificil/caro ayudar así como producir usando un lenguaje sin compilar. ...
kikogregoris
Sin conexión Enviar correo
12 de Ene, 2009
6:08 pm

Hola Ale, gente   Bueno, paradoxnj desarrollador de Jet3D respondio a lo que me interesaba saber.   Yes. Jet3D is a standard C DLL (same as Genesis).   Con...
kikogregoris
Sin conexión Enviar correo
13 de Ene, 2009
4:19 pm

La DLL que ellos distribuyen tiene los nombres mangleados? Creo que estas usando funciones de C++ y no la interfaz C... (si definis el metodo api conun...
Alejandro F. Reimondo
alereimondo
Sin conexión Enviar correo
16 de Ene, 2009
12:18 am

Hola Ale   Si los nombres estan mangueados. jaja. Pero solo por la convención que usan, que es __stdcall, segun leí en la pagina de microsoft, las funciones...
kikogregoris
Sin conexión Enviar correo
19 de Ene, 2009
12:33 pm
Avanzado

Copyright © 2009 Yahoo! de Argentina S.R.L. Todos los derechos reservados.
Política de privacidad - Condiciones del Servicio - Reglas de la comunidad de Yahoo! - Ayuda