c# 调用VCDLL的结构数组问题

doudoutxb 2006-10-26 01:25:20
vc的DLL原形是这样的:
typedef struct a
{
char ip[18];
WORD port;
}A;

typedef void (__stdcall Log)(const char* szlog);
typedef struct Connection
{
WORD size;
WORD timeout;
Log* PLOG;
A cfg[8];
}CONNECTION;
函数为:
typedef int (__stdcall Set)(const CONNECTION* para);
TR_IMPORT_EXPORT Set set;
想问问大家C# 要怎么转换?调用的函数要怎么写?谢谢了
...全文
1581 43 打赏 收藏 举报
写回复
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
feifeiyaqi 2006-10-29
  • 打赏
  • 举报
回复
public struct a
{
public string ip;
public string port;
}
public delegate void log(string logz);
public struct connection
{
public unit16 size;
public unit16 timeout;
public log plog;
public a[] cfg;

}
public extern static int Set( ref Connection para );
亮灯了 2006-10-28
  • 打赏
  • 举报
回复
学习中.
doudoutxb 2006-10-27
  • 打赏
  • 举报
回复
结贴,然后好好学习。
doudoutxb 2006-10-27
  • 打赏
  • 举报
回复
真是太感谢大家的热心解答。
特别感谢Knight94(愚翁) 和hdt(倦怠) 。
Knight94 2006-10-27
  • 打赏
  • 举报
回复
如上代码可能还有callingconvention的小问题,需要和你调用的时候进行调整。
Knight94 2006-10-27
  • 打赏
  • 举报
回复
试了几次,传递之前所有参数的地址都是正确,但是传递过去转换后,IP的地址就有问题,尝试用Marshal.WriteByte都无法正确传递,很怪。
ps: 可能别人有更好的办法。

to 我看网上还有一种方法,就是在编个C++。NET的DLL封装原来的DLL,但是这种资料特别少,所以我不会,能不能给点网址,或者建议。谢谢哦

vc.net调用还是比较简单,相互的转换没有这么麻烦。
以下是一个简单的调用,你可以用vc.net类库项目来包一下进行使用即可。
using namespace System::Diagnostics;
typedef struct a
{
char ip[18];
UInt16 port;
}A;

typedef void (*Log)(const char*);
typedef struct Connection
{
public:
UInt16 size;
UInt16 timeout;
Log PLOG;
A cfg[8];
}CONNECTION;

void GetLog( const char* szLog )
{
Debug::WriteLine( szLog );
}

typedef int (*Set)(const CONNECTION*);
//Call library
HINSTANCE hinstLib;
Set ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

// Get a handle to the DLL module.

hinstLib = LoadLibrary( youDllFileName );

// If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
ProcAdd = (Set) GetProcAddress(hinstLib, "Set");

// If the function address is valid, call the function.
if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
//Call it here
CONNECTION myConn;
strcpy( myConn.cfg[0].ip, "100.0.0.10" );
myConn.cfg[1].port = 21;
myConn.size = sizeof( myConn );
myConn.timeout = 0;
myConn.PLOG = GetLog;
(ProcAdd) ( &myConn );
}

// Free the DLL module.
fFreeResult = FreeLibrary(hinstLib);
}


doudoutxb 2006-10-27
  • 打赏
  • 举报
回复
我也觉得可能IP传递的也有问题,要不为什么会返回参数无效呢?但是我一直找不出问题在哪?
upup
iuhxq 2006-10-27
  • 打赏
  • 举报
回复
我的相关帖子也没解决:

http://community.csdn.net/Expert/topic/4837/4837084.xml?temp=.2444116
http://community.csdn.net/Expert/topic/4847/4847192.xml?temp=6.751651E-02
ilovechao1314 2006-10-27
  • 打赏
  • 举报
回复
mark
jingxijun 2006-10-27
  • 打赏
  • 举报
回复
俺以前也做过1个类似的调用,但最后还是没调成功
wumylove1234 2006-10-26
  • 打赏
  • 举报
回复
mark
doudoutxb 2006-10-26
  • 打赏
  • 举报
回复
不可以做大的修改,小的可以。但是得和客户商量,我看不到那里面的代码
Knight94 2006-10-26
  • 打赏
  • 举报
回复
你的dll文件能做修改吗?
doudoutxb 2006-10-26
  • 打赏
  • 举报
回复
召唤Knight94(愚翁) 解答,
谢谢,谢谢
doudoutxb 2006-10-26
  • 打赏
  • 举报
回复
难道是IP问题?是不是数组转string 变量的转换有问题?所以导致的参数无效识别不出来?
doudoutxb 2006-10-26
  • 打赏
  • 举报
回复
传递有问题?什么问题我怎么没发现?
Knight94 2006-10-26
  • 打赏
  • 举报
回复
我试了一下,其他都好说,目前就是A中IP传递老是有问题。
doudoutxb 2006-10-26
  • 打赏
  • 举报
回复
谢谢大家的热心解答,结贴接分吧
真相重于对错 2006-10-26
  • 打赏
  • 举报
回复
看看msdn吧
ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconinteroperatingwithunmanagedcode.htm
ps:需装msdn2003
doudoutxb 2006-10-26
  • 打赏
  • 举报
回复
我看网上还有一种方法,就是在编个C++。NET的DLL封装原来的DLL,但是这种资料特别少,所以我不会,能不能给点网址,或者建议。谢谢哦
加载更多回复(23)
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2006-10-26 01:25
社区公告

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