将字符串数组从 C# 应用程序传递到C++ DLL

Passing Array of string from C# application to C++ DLL

本文关键字:C++ DLL 应用程序 字符串 数组      更新时间:2023-10-16
string []URL = {"www.facebook.com","www.orkut.com","www.yahoo.com"};
            Int32 result = URL.Length;
            SetPolicyURL( URL,result );

这是我的 C# 代码,我正在尝试将字符串数组传递给像这样导入C++ Dll

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

但我无法在我的 C++ DLL 中接收它。

 PAWCTRL_API void __stdcall SetPolicyURL( char ** URLpolicy, __int32 noURL)
 {
for ( int i = 0; i < noURL; i++)
     {
    URLvector.push_back(URLpolicy[i]);
  }
 }

请任何人都可以帮我如何传递函数

谢谢提前

CharSet = CharSet.Auto 是错误的,它必须是 CharSet.Ansi 才能与本机代码中的 char* 兼容。 使用启用了非托管调试的调试器 如果仍有问题,请在函数的第一个语句上设置断点。

也去掉[PreserveSig],它在这里没有任何意义。 SetLastError 很可能是错误的,这仅在 Windows api 函数上很常见。

将字符串数组从 VB.Net 传递到 C 的示例。 与 32 位和 64 位兼容。

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

三:

#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]);
}