Pasar la matriz de cadenas de la aplicación C# a la DLL de C++

string []URL = {"www.facebook.com","www.orkut.com","www.yahoo.com"};
            Int32 result = URL.Length;
            SetPolicyURL( URL,result );

este es mi código C# donde estoy tratando de pasar la matriz de cadenas a C++ Dll que se importa así

     [PreserveSig]
    [DllImport("PawCtrl.dll", SetLastError = true, CharSet = CharSet.Auto,  CallingConvention = CallingConvention.StdCall)]
    public static extern void SetPolicyURL( string []policy, Int32 noURL);

pero no puedo recibirlo en mi DLL de C++.

 PAWCTRL_API void __stdcall SetPolicyURL( char ** URLpolicy, __int32 noURL)
 {

for ( int i = 0; i < noURL; i++)
     {

    URLvector.push_back(URLpolicy[i]);
  }
 }

Por favor, ¿alguien puede ayudarme cómo debo pasar la función?

gracias de antemano

preguntado el 03 de mayo de 12 a las 11:05

2 Respuestas

CharSet = CharSet.Auto es incorrecto, debe ser CharSet.Ansi para ser compatible con un char* en código nativo. Use el depurador con la depuración no administrada habilitada si todavía tiene problemas, establezca un punto de interrupción en la primera declaración de la función.

También suelte [PreserveSig], no tiene ningún significado aquí. Y es muy probable que SetLastError sea incorrecto, eso solo es típico en las funciones de API de Windows.

contestado el 03 de mayo de 12 a las 12:05

Ejemplo de pasar una matriz de cadenas de VB.Net a C. Compatible con 32 y 64 bits.

VB.Net:

Private Declare Function main_net32 Lib "MyCLib32.dll" Alias "_main_net@8" (ByVal argc As Int32, ByRef sArgs() As String) As Int32
Private Declare Function main_net64 Lib "MyCLib64.dll" Alias "main_net" (ByVal argc As Int32, ByRef sArgs() As String) As Int32

Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    Dim sArgs() As String = Environment.GetCommandLineArgs
    Dim result As Int32
    If Environment.Is64BitProcess Then
        result = main_net64(sArgs.Length, sArgs)
    Else
        result = main_net32(sArgs.Length, sArgs)
    End If
End Sub

C:

#define DllExport(result) __declspec(dllexport) result __stdcall
DllExport(int) main_net(int argc, char ***argv)
{
    int i;
    for(i=0;i<argc;i++)
        printf("%d: %s",i,(*argv)[i]);
}

Respondido el 16 de enero de 16 a las 15:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.