C#调用c++ dll,函数原型参数char* argv[] 本帖最后由 dwert 于 2009-10-22 18:03:09 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 char* argv[] 这个是字符串数组那么你可以尝试string[] argv;和ArrayList<string> argv; 你确定问题是出在char* argv[]上而不是LPRECT 上面吗? 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里的,调用可以的。 [DllImport(@"C:\c++的.dll")]private static extern int PlayerDoOpen(IntPtr hOut, ref tagRECT lpRect, int argc,ref string argv); 你转化的应该可以。具体的你描述的不清楚。可能是你没添加c++的引用[DllImport(@"C:\c++的.dll")] LPRECT有没有定义成和这个一样的结构呢?包括对齐方式 tagRECT结构体 没有设置对齐方式,估计那个会出问题的。 我刚加的布局 [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#的搞出来? 最终自己搞定,char*[] argv c#的描述是 string[] ASP.net 后台 生成文件 一个算法,能解释下吗? 同步socket即时返回信息给客户端 winform中listview的checkbox问题 关于DataGridView里用自定义控件的问题 急!!!!!如果在刷新treeview后,让某个节点被选中,该节点显示兰色显示 Dataview C# ftp unix 服务器问题 winform如何连接远程数据库SQL2000 WPF 带连接线 popup 不用popup也行重点是那个连接线 C# WinForm 多国语言时OpenFileDialog的问题 高手请留步,讨教Post方式发送邮件方式,重分相送
string[] argv;
和
ArrayList<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里的,调用可以的。
private static extern int PlayerDoOpen(IntPtr hOut, ref tagRECT lpRect, int argc,ref string argv);
你转化的应该可以。具体的你描述的不清楚。可能是你没添加c++的引用[DllImport(@"C:\c++的.dll")]
[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#的搞出来?