调用c++Dll函数,如何生成参数(C#)

foolfool 2009-02-05 08:08:39
调用c++Dll函数,生成 SFaxParam 参数的问题(C#)
c的头文件相关的代码如下:

typedef HANDLE SmartFaxObj;
enum EResolution
{
RE_FINE,
RE_STANDARD
};
enum EClass
{
CLASS_1,
CLASS_2
};
enum EErrorCorrect
{
ECM_DISABLE,
ECM_ENABLE
};
enum EBinaryFile
{
BFT_DISABLE,
BFT_ENABLE
};
enum ECreateHead
{
CH_DISABLE,
CH_ENABLE
};
enum EUsed2D
{
U2D_DISABLE,
U2D_ENABLE
};

enum EFaxSpeed
{
FS_2400,
FS_4800,
FS_7200,
FS_9600,
FS_1200,
FS_1440,
};
enum EVolume
{
VO_OFF,
VO_LOW,
VO_MIDDLE,
VO_HIGH
};
typedef struct tag_SFaxParam
{
HCALL hCall;
HLINE hLine;
EResolution Resolution; // 传真质量(RE_FINE | RE_STARDARD)

unsigned char nComPort ; // 端口号(1 - 256 )

EFaxSpeed Speed; //传真速度 ( 24 | 48 | 72 | 96 | 120 |144)

EUsed2D Is2D; //压缩方式(U2D_ENABLE | U2D_DISABLE)

EClass Class; //传真类型(CLASS_1 | CLASS_2 | CLASS_1.0 | CLASS_2.0)

EVolume Volume; //Modem应答音量( 0 | 1 | 2 | 3 )

char FileName[MAX_PATH]; //传真文件名

char Identifi[56]; //传真识别符(一般添入自己的传真号码)

EErrorCorrect Ecm; //纠错方式(ECM_ENABLE | ECM_DISABLE )

HWND Hwnd; // 消息窗口句柄

UINT Msg; //消息ID (WM_SMARTFAX)

SmartFaxObj *hFax; //传真对象句柄

// send extrac parameter
char FaxNumber[21]; //传真号码

char From[128]; //发送者信息

char To[128]; //接受者信息

ECreateHead CreateHead; //建立传真页眉信息( CH_DISABLE | CH_ENABLE)

EBinaryFile BinaryFile; //两进制文件传输(BFT_DISABLE | BFT_ENABLE )

int nStartPage; //开始页

#if defined(__cplusplus) && !defined(__BORLANDC__)
//EXPDEF SFaxParam();
#endif

}SFaxParam;
const unsigned short D1DMR = 0; // 1-D Modified Huffman
const unsigned short D2DMR = 1; // 2-D Modified Huffman
const unsigned short D2DMMR = 3; // 2-D Modified Modified Read
typedef void (CALLBACK * MODEMLISLITNECALLBACK)(DWORD dwDeviceId, const char *sLineName, const char *ComPort,unsigned long lParam);
static void CALLBACK ModemListCallbackFunc(DWORD dwDeviceId, const char *sLineName, const char *ComPort,unsigned long lParam);
static void CALLBACK ModemListCallbackFunc(DWORD dwDevice, const char *sLineName, const char *ComPort,unsigned long lParam)
{
fprintf(stderr,"DeviceID: %d \nLineName: %s\nCommPort: %s \n",dwDevice,sLineName,ComPort);
}



/**********************************************************************************
函数名:<_TapiSmartReceiveFax>
----------------------------
功能: 通过TAPI接口接收传真!
----------------------------
参数:
1: hFax 传真对象句柄
2: hCall 传真参数
3: hline 传真参数
4: FileName 传真文件名
5: Identifi 传真识别符(一般添入自己的传真号码)
6: Volume Modem应答音量( 0 | 1 | 2 | 3 )
7: Speed 传真需要的速度( 24 | 48 | 72 | 96 | 120 |144)
8: Class 传真类型(CLASS_1 | CLASS_2 | CLASS_1.0 | CLASS_2.0)
9: Is2d 压缩方式(U2D_ENABLE | U2D_DISABLE)
10: ECM 纠错方式(ECM_ENABLE | ECM_DISABLE )
11: hWnd 消息窗口句柄
1: Msg 消息ID (WM_SMARTFAX)



// fax message for windows

#define WM_SMARTFAX WM_USER+101


#define WM_FAXMISSIONINOVER 0x101
#define WM_FAXCHANGESTATE 0x102
#define WM_FAXSETCIS 0x103
#define WM_FAXSETSPEED 0x104
#define WM_FAXMISSIONOUTOVER 0x105
#define WM_FAXRECVPAGEDATA 0x106
#define WM_FAXSENDPAGEDATA 0x107
#define WM_ACCEPTPAGE 0x108
#define WM_REJECTPAGE 0x109
#define WM_FAXSPEED 0x110
#define WM_FAXPROCESSPAGEDATA 0x111
#define WM_FAXUSERCANCE 0x112
#define WM_FAXECM 0x113
#define WM_FAXPAGE 0x114

#define WM_FAXRING 0x115

#define WM_FAXMONITORCLOSE 0x116
#define WM_FAXMONITORSTART 0x117
#define WM_FAXMONITORFAIL 0x118

#define WM_FAXANI 0x119


#define FAXINIT 0
#define DIALFAX 1
#define ANSWER 2
#define NEGOTIATION 3
#define TRAINING 4



/*

#ifdef __cplusplus
}
#endif
*/

#endif //__SMARTFAX_H_

...全文
137 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
foolfool 2009-02-05
  • 打赏
  • 举报
回复
whycom,谢谢,我试试去,回头给你分.
whycom 2009-02-05
  • 打赏
  • 举报
回复
SmartFaxObj C#定义一个与c 内存布局一至的struct
SmartFaxObj* 如果只是一个指针,用intptr 或ref 类型

这个intptr 可以用个Marshal.StructureToPtr 获得.那个struct成员太多,我就不一一写了,给你个msdn上例子
api 函数
c 原型:;

BOOL GetVersionEx(LPOSVERSIONINFO lpVersionInfo);
typedef struct _OSVERSIONINFO
{
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformId;
TCHAR szCSDVersion[ 128 ];
} OSVERSIONINFO;

c# 定义

// Declares a class member for each structure element.
[ StructLayout( LayoutKind.Sequential )]
[ StructLayout( LayoutKind.Sequential )]
public class OSVersionInfo
{
public int OSVersionInfoSize;

[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]
public String versionString;
}
[ StructLayout( LayoutKind.Sequential )]
public struct OSVersionInfo2
{
public int OSVersionInfoSize;

[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]
public String versionString;
}
public class LibWrap
{
[ DllImport( "kernel32" )]
public static extern bool GetVersionEx( [In, Out] OSVersionInfo osvi );

[ DllImport( "kernel32", EntryPoint="GetVersionEx" )]
public static extern bool GetVersionEx2( ref OSVersionInfo2 osvi );
}
public class App
{
public static void Main()
{
Console.WriteLine( "\nPassing OSVersionInfo as class" );

OSVersionInfo osvi = new OSVersionInfo();
osvi.OSVersionInfoSize = Marshal.SizeOf( osvi );

LibWrap.GetVersionEx( osvi );

Console.WriteLine( "Class size: {0}", osvi.OSVersionInfoSize );

Console.WriteLine( "\nPassing OSVersionInfo as struct" );

OSVersionInfo2 osvi2 = new OSVersionInfo2();
osvi2.OSVersionInfoSize = Marshal.SizeOf( osvi2 );

LibWrap.GetVersionEx2( ref osvi2 );
Console.WriteLine( "Struct size: {0}", osvi2.OSVersionInfoSize );

}
}

foolfool 2009-02-05
  • 打赏
  • 举报
回复
请问三楼
SmartFaxObj *hFax; //传真对象句柄 这该怎么转
sxmonsy 2009-02-05
  • 打赏
  • 举报
回复
友情UP
whycom 2009-02-05
  • 打赏
  • 举报
回复

又不是com的?没有类型库,用什么tlbimp
楼主在msdn搜索下平台调用,把c中类型,转为c#的类型,即可

callback 类型 转为委托,
周公 2009-02-05
  • 打赏
  • 举报
回复
下面的命令所生成的程序集与在 myTest.tlb 中找到的类型库具有相同的名称,并且具有 .dll 扩展名。
tlbimp myTest.tlb


下面的命令生成一个名为 myTest.dll 的程序集。
tlbimp myTest.tlb /out:myTest.dll


下面的命令生成一个名称与 MyModule.dll\1 所指定的类型库的名称相同且扩展名为 .dll 的程序集。MyModule.dll\1 必须位于当前目录中。
tlbimp MyModule.dll\1


下面的命令为类型库 TestLib.dll 生成一个名为 myTestLib.dll 的程序集。/transform:dispret 选项将该类型库中的调度接口方法的任何 [out, retval] 参数转换为托管库中的返回值。
tlbimp TestLib.dll /transform:dispret /out:myTestLib.dll


上例中的类型库 TestLib.dll 包含一个名为 SomeMethod 的调度接口方法,它返回 void 且具有一个 [out, retval] 参数。下面的代码是 TestLib.dll 中 SomeMethod 的输入类型库方法签名。

void SomeMethod([out, retval] VARIANT_BOOL*);


指定 /transform:dispret 选项会使 Tlbimp.exe 将 SomeMethod 的 [out, retval] 参数转换为 bool 返回值。以下是当指定 /transform:dispret 选项时,Tlbimp.exe 为托管库 myTestLib.dll 中的 SomeMethod 生成的方法签名。
bool SomeMethod();


如果使用 Tlbimp.exe 生成 TestLib.dll 的托管库时没有指定 /transform:dispret,则该工具为托管库 myTestLib.dll 中的 SomeMethod 生成以下方法签名。
void SomeMethod(out bool x);
周公 2009-02-05
  • 打赏
  • 举报
回复
用tlbimp呢?

111,130

社区成员

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

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

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