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.