本帖最后由 dwert 于 2009-10-22 18:03:09 编辑

解决方案 »

  1.   

    char* argv[] 这个是字符串数组那么你可以尝试
    string[] argv;

    ArrayList<string> argv;
      

  2.   

    你确定问题是出在char* argv[]上而不是LPRECT 上面吗?
      

  3.   

    c++函数原型:__declspec(dllimport) int PlayerDoOpen(HWND hOwner,LPRECT lpRect,int argc,char *argv[]);//播放资源 C#函数描述:int PlayerDoOpen(IntPtr hOut, ref tagRECT lpRect, int argc,ref string argv);
        public struct tagRECT
        {        Int32 left;
            Int32 top;
            Int32 right;
            Int32 bottom;        public tagRECT(Int32 l, Int32 t, Int32 r, Int32 b)
            {
                left = l;
                top = t;
                right = r;
                bottom = b;
            }
        }
     string g_szPlayPath = @"C:\t\ConsoleApplication1\bin\Debug\"; IntPtr p = Marshal.AllocCoTaskMem(g_szPlayPath.Length); Marshal.Copy(g_szPlayPath.ToCharArray(), 0, p, g_szPlayPath.Length); int size=  Marshal.ReadInt32(p); string str = Marshal.PtrToStringAnsi(p); PlayerDoOpen s = (PlayerDoOpen)dll.Invoke("PlayerDoOpen", typeof(PlayerDoOpen));
      
    s(hOut, ref g_rectPlay, 1, ref str);//str 其实一个播放器的路径,和,播放的资源文件路径。所以这个c++里是char* argv[]
    还有这里如果就传一个参数,就是播放器路径的话,就行了!
    int PlayerDoOpen(HWND hOwner,LPRECT lpRect,int argc,char *argv[]);HWND g_hPlayWindow=NULL;
    HANDLE g_hPlayThread=NULL;
    DWORD g_dwPlayThread=0;
    char g_szPlayPath[MAX_PATH]="\0";
    char g_szPlayFile[MAX_PATH]="c:\\media.xmml\0";
    char *g_szPlayArgv[]={
     g_szPlayPath,
     "-i",
     g_szPlayFile,
     "\0"
    };
    这个是我VC里的,调用可以的。
      

  4.   

    [DllImport(@"C:\c++的.dll")]
    private static extern int PlayerDoOpen(IntPtr hOut, ref tagRECT lpRect, int argc,ref string argv); 
    你转化的应该可以。具体的你描述的不清楚。可能是你没添加c++的引用[DllImport(@"C:\c++的.dll")]
      

  5.   

    LPRECT有没有定义成和这个一样的结构呢?包括对齐方式
      

  6.   

    tagRECT结构体 没有设置对齐方式,估计那个会出问题的。
      

  7.   

    我刚加的布局
        [StructLayout(LayoutKind.Explicit)]
        public struct tagRECT
        {
            [FieldOffset(0)]
            Int32 left;
            [FieldOffset(4)]
            Int32 top;
            [FieldOffset(8)]
            Int32 right;
            [FieldOffset(12)]
            Int32 bottom;        public tagRECT(Int32 l, Int32 t, Int32 r, Int32 b)
            {
                left = l;
                top = t;
                right = r;
                bottom = b;
            }
        }
    结果依然范特西!!!哎~~谁有信息,我发一份,调成功VC代码,然后帮我把C#的搞出来?
      

  8.   

    最终自己搞定,char*[] argv  c#的描述是 string[]