C/Visual C - compilar en C como dll

 
Vista:

compilar en C como dll

Publicado por rody (2 intervenciones) el 14/10/2004 14:32:58
paso a explicar mi problema , necesito compilar un function que esta hecha en C como dll , para despues poder referenciarla en visual basic el tema es que lamentablemente de C no se nada (por eso necesito poder hacerlo asi) quisiera saber si se puede y como lo hago ...
desde ya gracias...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:compilar en C como dll (1/1)

Publicado por fernando.gomez (1603 intervenciones) el 02/11/2004 22:12:11
Bueno, es todo un wato lo que tendrás que hacer. Si empleas Visual C, haces algo así:

tipoRetorno __declspec(dllexport) MiFuncion(tipo param1 /* etc */)
{ // tu funcion
}

Nota el __declspec(dllexport), es lo más importante. Si no empleas Visual C, puedes consultar la documentación de tu compilador, o agregarlo a un archivo DEF:

; agregar la funcion
MiFuncion @1 ; nota el ordinal y que ; es un comentario

Finalmente, en VB lo que haces es usar una sentencia declare:

[Acceso] Declare Function nombreFuncionVB Lib "tuLibreria.dll" _
Alias "nombreFuncionC"( tipo param1) As tipoRetorno

Ok, explico la sentencia anterior. [Acceso] es precísamente el nivel que le das a la función: Public, Private, etc. Notarás que hay algo raro en nombreFuncionVB y nombreFuncionC. Bueno, pues sucede que C acepta caracteres que VB no. Por ejemplo, una funcion en C que se llame _MiFuncion sería inválida en VB (por el _). Entonces, tienes que darle un nombre compatible (en este caso, digamos MiFuncion. Ahora bien, después de Alias, pones el verdadero nombre C de la función.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:compilar en C como dll (2/2)

Publicado por fernando.gomez (1603 intervenciones) el 02/11/2004 22:12:44
Pongamos de ejemplo que quieres importar una función _MiFuncion que te regrese un int y que sea público. Esta función reside en func.dll. Toma como parámetro un long. Entonces, tu importación quedaría algo así:

Public Declare Function MiFuncion Lib "func.dll" _
Alias "_MiFuncion"( ByVal nParam1 As Long) As Integer

Después de esto, en algún otro lugar puedes mandar llamar a la función como si fuera otra función más de VB:

Sub OtraSubrutina
Rem mandas llamar a la DLL
Dim i As Integer

i = MiFuncion(5)
Rem etcétera
End Sub

Finalmente, si tu función en C no regresa valor (es decir, es void) entonces puedes cambiar Function por Sub en tu sentencia Declare.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:compilar en C como dll (2/2)

Publicado por rody (2 intervenciones) el 03/11/2004 14:21:35
gracias...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:compilar en C como dll (ANEXO)

Publicado por fernando.gomez (1603 intervenciones) el 04/11/2004 16:51:43
Estaba releyendo lo que te comenté, y se me olvidó decir una cosa importante.

Public Declare Function MiFuncion Lib "func.dll" _
Alias "_MiFuncion"( ByVal nParam1 As Long) As Integer

nota que en la declaración anterior, el parámetro es pasado por valor. En C/C++ los valores primitivos se pasan, por defecto, por valor. Esto es importante, porque VB los pasa por referencia. Por ello debes especificar que lo pasas como valor con ByVal.

Otra cosa, en C puedes crear estructuras de datos. En VB se les llama Types, y puedes emplear un Type para pasar una estructura como parámetro.

Si el tipo de dato en C no existe en VB, puedes emplear el tipo de dato Any. Nota: Any y Variant no son los mismos. En C, Variant es una unión de varios tipos de valores posibles, pero no incluye todos. Por eso, Any es como una forma de pasar argumentos genéricos.

Public Declare Function MiFuncion Lib "func.dll" _
Alias "_MiFuncion"( ByVal nParam1 As Long) As Any

Ya por último, si tu función te pide un puntero (long* por ejemplo) entonces pasas el valor por referencia, que también lo puedes especificar con ByRef.

Public Declare Function MiFuncion Lib "func.dll" _
Alias "_MiFuncion"( ByRef nParam1 As Long) As Integer

Saludos.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar