C#调用c++ dll,函数原型参数char* argv[]

dwert 2009-10-22 05:58:29
你好!我最近在做C#调用C++写的dll ,现在出现一个问题,就是c++的函数里有这样一个参数 char* argv[]
请问,C#里,我该怎么样传参数给他!
__declspec(dllimport) int PlayerDoOpen(HWND hOwner,LPRECT lpRect,int argc,char *argv[]);//播放资源

我的写的
public delegate bool PlayerDoOpen(IntPtr hOut, ref tagRECT lpRect, int argc, ref char[] argv);
关键是char* argv[]这个参数,c#该怎么样传!
如果觉得分不够,可以在加。具体调用的方法都知道,就是参数传送问题。
...全文
320 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dwert 2009-10-28
  • 打赏
  • 举报
回复
最终自己搞定,char*[] argv c#的描述是 string[]
dwert 2009-10-23
  • 打赏
  • 举报
回复
不行的啊!
CCppMfc 2009-10-23
  • 打赏
  • 举报
回复
IntPtr argv[]
dwert 2009-10-23
  • 打赏
  • 举报
回复
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里的,调用可以的。
qldsrx 2009-10-23
  • 打赏
  • 举报
回复
你确定问题是出在char* argv[]上而不是LPRECT 上面吗?
dwert 2009-10-23
  • 打赏
  • 举报
回复
来人啊!!!!
dwert 2009-10-23
  • 打赏
  • 举报
回复
我刚加的布局
[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#的搞出来?
qldsrx 2009-10-23
  • 打赏
  • 举报
回复
tagRECT结构体 没有设置对齐方式,估计那个会出问题的。
ztenv 2009-10-23
  • 打赏
  • 举报
回复
LPRECT有没有定义成和这个一样的结构呢?包括对齐方式
qs99521 2009-10-23
  • 打赏
  • 举报
回复
[DllImport(@"C:\c++的.dll")]
private static extern int PlayerDoOpen(IntPtr hOut, ref tagRECT lpRect, int argc,ref string argv);
你转化的应该可以。具体的你描述的不清楚。可能是你没添加c++的引用[DllImport(@"C:\c++的.dll")]
wenbin 2009-10-22
  • 打赏
  • 举报
回复
char* argv[] 这个是字符串数组

那么你可以尝试
string[] argv;

ArrayList<string> argv;

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧