successfully - Exportación de la función c++, declarada en vb6, error de ejecución del "error de la llamada a procedimiento remoto"
visual basic download (3)
Tengo un dll escrito en C ++ que se está exportando así:
extern "C" {
extern _declspec(dllexport) (VOID) Merge(LPCSTR szFileName, LPCSTR szMergeString, DWORD dwAlignment, BOOL fRepeat);
}
Esa función se define en otro lugar como:
extern _declspec(dllexport) (VOID) Merge(LPCSTR szFileName, LPCSTR szMergeString, DWORD dwAlignment, BOOL fRepeat)
{
Tools::Merge(gcnew String(szFileName), gcnew String(szMergeString), dwAlignment, fRepeat == TRUE);
}
En mi dll vb6, he declarado la llamada remota de esta manera:
Private Declare Sub Merge Lib "Tools.dll" (fileName As String, mergeString As String, Alignment As Long, repeated As Boolean)
Luego lo llamo en el código de esta manera:
Merge strPageFileName, "COPY", 5, True
Cuando ejecuto la aplicación, aparece "Error de automatización: la llamada a procedimiento remoto falló" en un cuadro de mensaje.
Tools.dll
está en C: / Windows / system32. Probé con un mal nombre dll, para asegurarme de que ese no era el problema, y obtuve un error al decir que no podía encontrar el archivo, así que sé que no es así. ¿Hay algo más que deba hacer para que esto funcione?
EDITAR: Cambiar el tipo de variable por la respuesta de xxbbcc a continuación permitió que esto funcione correctamente. Sin embargo, creó un problema nuevo, hasta ahora totalmente imposible de resolver. Creé otra pregunta aquí que tiene algunos detalles al respecto.
La llamada remota está ocurriendo en un dll COM +, dentro de una función que devuelve tipo integer
a otro DLL no COM. Por alguna extraña razón, la función COM + dll ahora está devolviendo una variante del tipo VT_ERROR
lugar de un entero. Lo he probado a fondo y he determinado que no importa lo que haga con el valor de retorno de antemano, configurándolo con cualquier valor, etc., siempre devuelve un error. La parte extraña es que el valor del error es aparentemente 0. He llamado a CInt(returnValue)
, CStr(returnValue)
y CLng(returnValue)
, y devuelven 0
, Error 0
y 0
, respectivamente.
No he podido encontrar ninguna información que explique por qué una función que se supone que devuelve un entero de repente devolverá un error. Esto me está dando un error de desajuste de tipo en la función que no es COM +, ya que intenta asignar el retorno a un entero local. Cambiar eso a una variante me permitió hacer los moldes anteriores. Llamar a VarType(returnValue)
da 10, que es vbError
. No queremos perder potencialmente la información de fallas de otras llamadas dentro de la DLL COM +, por lo que no puedo ignorar el valor de retorno.
Intente declarar los parámetros de cadena en su declaración Declare de VB6 ByVal. Cambia "nombre de archivo como cadena" a "nombre de archivo ByVal como cadena", etc.
Mi solución actual a esto ha sido escribir una pequeña aplicación de consola de C ++ que llama a la función exportada, y llamar al exe desde dentro de vb6 dll.
BOOL
debe definirse como Long
en VB6 y el valor pasado para él debe ser 0
o 1
, no valores booleanos. También debe ser ByVal
: dado que los parámetros se pasan por valores en C / C ++, debe asegurarse de que su programa VB6 lo siga. En este momento, su programa VB6 pasa un puntero a un Boolean
, en lugar de un Long
real. Sus cadenas también se deben definir como ByVal
.
Este artículo , aunque está fechado, contiene información útil sobre por qué las cadenas deben pasarse desde VB6 como código ByVal
a código C.
Otra cosa: nunca exporté con éxito una función a VB6 usando declspec (dllexport). Hice un montón de codificación C / VB6 en el pasado, pero la única forma en que alguna vez funcionó fue a través de archivos DEF. No puedo explicar por qué (puede haber sido por mi ignorancia). Ignora esta parte de mi respuesta si corregir el parámetro BOOL resuelve tu problema. :)