江湖救急,c++结构体转成c#的问题

knet 2011-11-01 10:31:13
我想把下面的结构体转成 c#,然后在c#中使用,请帮忙

1. typedef struct _IMEWRD {
2. WCHAR* pwchReading;
3. WCHAR* pwchDisplay;
4. Union {
5. ULONG ulPos;
6. Struct {
7. WORD nPos1;
8. WORD nPos2;
9. };
10. };
11. ULONG* rgulAttrs[2];
12. INT cbComment;
13. IMEUCT uct;
14. VOID* pvComment;
15. } IMEWRD, *PIMEWRD;

Members

pwchReading
Value that specifies the string that contains the reading string of the word in Unicode.
pwchDisplay
Value that specifies the string that contains the word in Unicode.
ulPos
Part-of-speech number.
nPos1
Reserved. Use the ulPos member instead.
nPos2
Reserved. Use the ulPos member instead.
rgulAttrs
Set the value to NULL. Ignored.
cbComment
Set the value to zero. Ignored.
uct
Set the value to zero. Ignored.
pvComment
Set the value to NULL. Ignored.

Requirements
...全文
459 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunquest 2012-10-29
  • 打赏
  • 举报
回复
最后怎么样了?没有消息了?我也卡在这里了
jshi123 2011-11-08
  • 打赏
  • 举报
回复
你的用法错了。
GetKeyboardLayout(0)得到是当前线程的输入法,缺省是“中文-美式键盘”(0x08040804),而这个输入法是没有词库功能的。
ImmRegisterWord中,dwWordStyle要填0x80000000,代表用户自定义词库,前面一个参数是拼英,占8个字符,后面是汉字,比如:
ImmRegisterWord(0xE0200804, "jiang hu jiu ji ", 0x80000000, "江湖救急");
knet 2011-11-08
  • 打赏
  • 举报
回复
Declare Function ImmRegisterWord Lib "imm32.dll" Alias "ImmRegisterWordA" _
(ByVal hKL As Integer, ByVal lpszReading As String, ByVal dwStyle As Integer, _
ByVal lpszRegister As String) As Integer

Private Declare Function GetKeyboardLayout_ Lib "user32" (ByVal idThread As integer) As integer_


dim hkl as integer = GetKeyboardLayout(0)
dim test as integer = ImmRegisterWord(hkl,"wo",1,"aaaaa")
win7下
返回值0,失败

没有xp系统,不知道xp下如何
jshi123 2011-11-08
  • 打赏
  • 举报
回复
dwStyle是词的类别,不是词性,可以用ImmGetRegisterWordStyle得到,
hkl要用GetKeyboardLayoutList得到。

Declare Function ImmRegisterWord Lib "imm32.dll" Alias "ImmRegisterWordA" _
(ByVal hKL As Integer, ByVal lpszReading As String, ByVal dwStyle As Integer, _
ByVal lpszRegister As String) As Integer

Sub Main()
ImmRegisterWord(&HE0200804, "jiang hu jiu ji ", &H80000000, "江湖救急")
End Sub
knet 2011-11-08
  • 打赏
  • 举报
回复
对应0xE0200804和0x80000000这两个参数是integer类型,直接这样写有类型错误,转换一下?

另,我看到资料说第三个参数是登录的词汇的词性参数,比如1-名词

哪里有错误?
knet 2011-11-07
  • 打赏
  • 举报
回复
imm提供的那些方法,应该在win7中不可用,所以用到这个函数
jshi123 2011-11-07
  • 打赏
  • 举报
回复
可以在win7下用
jshi123 2011-11-04
  • 打赏
  • 举报
回复
如果要在词库中添加单词,不需要native ime,用imm就可以了
knet 2011-11-03
  • 打赏
  • 举报
回复
search for help
knet 2011-11-02
  • 打赏
  • 举报
回复
我搜索过这个标题

有个中国人在微软论坛上问的这个问题,但是没答案

网上资料就一个参数说明,没有用例
knet 2011-11-02
  • 打赏
  • 举报
回复
你给的页面打不开啊
jshi123 2011-11-01
  • 打赏
  • 举报
回复

[StructLayout(LayoutKind.Explicit)]
struct IMEWRD
{
[FieldOffset(0), MarshalAs(UnmanagedType.LPWStr)]
string pwchReading;
[FieldOffset(4), MarshalAs(UnmanagedType.LPWStr)]
string pwchDisplay;

[FieldOffset(8)]
uint ulPos;
[FieldOffset(8)]
ushort nPos1;
[FieldOffset(10)]
ushort nPos2;

[FieldOffset(12)]
IntPtr rgulAttrs;
[FieldOffset(16)]
int cbComment;
[FieldOffset(20)]
int uct;
[FieldOffset(24)]
IntPtr pvComment;
}
liu513133872 2011-11-01
  • 打赏
  • 举报
回复
比较不好看,感觉这个结构不好分析Union { ULONG ulPos;Struct { WORD nPos1; WORD nPos2; }; }; up 一下
mabaolin 2011-11-01
  • 打赏
  • 举报
回复
自己对照着改:


static_cast: 非强制转换,窄化转化,void*强制变换
const_cast:对const,volatile进行转换
reinterpret_cast:转换为完全不同的意思.
dynamic_caset:用于类型安全的向下转换.


static_cast<int>(i);
static_case<char>(i);



3. char* a[]
atoi,atol,atof分别把字符数组转换为int,long,float类型
atoi(a[1])

//C++中的DLL函数原型为
//extern "C" __declspec(dllexport) bool 方法名一(const char* 变量名1, unsigned char* 变量名2)
//extern "C" __declspec(dllexport) bool 方法名二(const unsigned char* 变量名1, char* 变量名2)

//C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试
//c++:HANDLE(void *) ---- c#:System.IntPtr
//c++:Byte(unsigned char) ---- c#:System.Byte
//c++:SHORT(short) ---- c#:System.Int16
//c++:WORD(unsigned short) ---- c#:System.UInt16
//c++:INT(int) ---- c#:System.Int16
//c++:INT(int) ---- c#:System.Int32
//c++:UINT(unsigned int) ---- c#:System.UInt16
//c++:UINT(unsigned int) ---- c#:System.UInt32
//c++:LONG(long) ---- c#:System.Int32
//c++:ULONG(unsigned long) ---- c#:System.UInt32
//c++:DWORD(unsigned long) ---- c#:System.UInt32
//c++:DECIMAL ---- c#:System.Decimal
//c++:BOOL(long) ---- c#:System.Boolean
//c++:CHAR(char) ---- c#:System.Char
//c++:LPSTR(char *) ---- c#:System.String
//c++:LPWSTR(wchar_t *) ---- c#:System.String
//c++:LPCSTR(const char *) ---- c#:System.String
//c++:LPCWSTR(const wchar_t *) ---- c#:System.String
//c++:PCAHR(char *) ---- c#:System.String
//c++:BSTR ---- c#:System.String
//c++:FLOAT(float) ---- c#:System.Single
//c++:DOUBLE(double) ---- c#:System.Double
//c++:VARIANT ---- c#:System.Object
//c++:PBYTE(byte *) ---- c#:System.Byte[]

//c++:BSTR ---- c#:StringBuilder
//c++:LPCTSTR ---- c#:StringBuilder
//c++:LPCTSTR ---- c#:string
//c++:LPTSTR ---- c#:[MarshalAs(UnmanagedType.LPTStr)] string
//c++:LPTSTR 输出变量名 ---- c#:StringBuilder 输出变量名
//c++:LPCWSTR ---- c#:IntPtr
//c++:BOOL ---- c#:bool
//c++:HMODULE ---- c#:IntPtr
//c++:HINSTANCE ---- c#:IntPtr
//c++:结构体 ---- c#:public struct 结构体{};
//c++:结构体 **变量名 ---- c#:out 变量名 //C#中提前申明一个结构体实例化后的变量名
//c++:结构体 &变量名 ---- c#:ref 结构体 变量名


//c++:WORD ---- c#:ushort
//c++:DWORD ---- c#:uint
//c++:DWORD ---- c#:int

//c++:UCHAR ---- c#:int
//c++:UCHAR ---- c#:byte
//c++:UCHAR* ---- c#:string
//c++:UCHAR* ---- c#:IntPtr

//c++:GUID ---- c#:Guid
//c++:Handle ---- c#:IntPtr
//c++:HWND ---- c#:IntPtr
//c++:DWORD ---- c#:int
//c++:COLORREF ---- c#:uint


//c++:unsigned char ---- c#:byte
//c++:unsigned char * ---- c#:ref byte
//c++:unsigned char * ---- c#:[MarshalAs(UnmanagedType.LPArray)] byte[]
//c++:unsigned char * ---- c#:[MarshalAs(UnmanagedType.LPArray)] Intptr

//c++:unsigned char & ---- c#:ref byte
//c++:unsigned char 变量名 ---- c#:byte 变量名
//c++:unsigned short 变量名 ---- c#:ushort 变量名
//c++:unsigned int 变量名 ---- c#:uint 变量名
//c++:unsigned long 变量名 ---- c#:ulong 变量名

//c++:char 变量名 ---- c#:byte 变量名 //C++中一个字符用一个字节表示,C#中一个字符用两个字节表示
//c++:char 数组名[数组大小] ---- c#:MarshalAs(UnmanagedType.ByValTStr, SizeConst = 数组大小)] public string 数组名; ushort

//c++:char * ---- c#:string //传入参数
//c++:char * ---- c#:StringBuilder//传出参数
//c++:char *变量名 ---- c#:ref string 变量名
//c++:char *输入变量名 ---- c#:string 输入变量名
//c++:char *输出变量名 ---- c#:[MarshalAs(UnmanagedType.LPStr)] StringBuilder 输出变量名

//c++:char ** ---- c#:string
//c++:char **变量名 ---- c#:ref string 变量名
//c++:const char * ---- c#:string
//c++:char[] ---- c#:string
//c++:char 变量名[数组大小] ---- c#:[MarshalAs(UnmanagedType.ByValTStr,SizeConst=数组大小)] public string 变量名;

//c++:struct 结构体名 *变量名 ---- c#:ref 结构体名 变量名
//c++:委托 变量名 ---- c#:委托 变量名

//c++:int ---- c#:int
//c++:int ---- c#:ref int
//c++:int & ---- c#:ref int
//c++:int * ---- c#:ref int //C#中调用前需定义int 变量名 = 0;

//c++:*int ---- c#:IntPtr
//c++:int32 PIPTR * ---- c#:int32[]
//c++:float PIPTR * ---- c#:float[]


//c++:double** 数组名 ---- c#:ref double 数组名
//c++:double*[] 数组名 ---- c#:ref double 数组名
//c++:long ---- c#:int
//c++:ulong ---- c#:int

//c++:UINT8 * ---- c#:ref byte //C#中调用前需定义byte 变量名 = new byte();


//c++:handle ---- c#:IntPtr
//c++:hwnd ---- c#:IntPtr


//c++:void * ---- c#:IntPtr
//c++:void * user_obj_param ---- c#:IntPtr user_obj_param
//c++:void * 对象名称 ---- c#:([MarshalAs(UnmanagedType.AsAny)]Object 对象名称



//c++:char, INT8, SBYTE, CHAR ---- c#:System.SByte
//c++:short, short int, INT16, SHORT ---- c#:System.Int16
//c++:int, long, long int, INT32, LONG32, BOOL , INT ---- c#:System.Int32
//c++:__int64, INT64, LONGLONG ---- c#:System.Int64
//c++:unsigned char, UINT8, UCHAR , BYTE ---- c#:System.Byte
//c++:unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t ---- c#:System.UInt16
//c++:unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT ---- c#:System.UInt32
//c++:unsigned __int64, UINT64, DWORDLONG, ULONGLONG ---- c#:System.UInt64
//c++:float, FLOAT ---- c#:System.Single
//c++:double, long double, DOUBLE ---- c#:System.Double

//Win32 Types ---- CLR Type


//Struct需要在C#里重新定义一个Struct
//CallBack回调函数需要封装在一个委托里,delegate static extern int FunCallBack(string str);

//unsigned char** ppImage替换成IntPtr ppImage
//int& nWidth替换成ref int nWidth
//int*, int&, 则都可用 ref int 对应
//双针指类型参数,可以用 ref IntPtr
//函数指针使用c++: typedef double (*fun_type1)(double); 对应 c#:public delegate double fun_type1(double);
//char* 的操作c++: char*; 对应 c#:StringBuilder;
//c#中使用指针:在需要使用指针的地方加 unsafe


//unsigned char对应public byte
/*
* typedef void (*CALLBACKFUN1W)(wchar_t*, void* pArg);
* typedef void (*CALLBACKFUN1A)(char*, void* pArg);
* bool BIOPRINT_SENSOR_API dllFun1(CALLBACKFUN1 pCallbackFun1, void* pArg);
* 调用方式为
* [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
* public delegate void CallbackFunc1([MarshalAs(UnmanagedType.LPWStr)] StringBuilder strName, IntPtr pArg);
*


josxhn 2011-11-01
  • 打赏
  • 举报
回复
帮顶~~~
yojinlin 2011-11-01
  • 打赏
  • 举报
回复
友情幫頂。
sdl2005lyx 2011-11-01
  • 打赏
  • 举报
回复
确认是com,问题就好办了,没有这么多类型映射的麻烦:


How to use COM Interface IFEDictionary with c#
knet 2011-11-01
  • 打赏
  • 举报
回复
等我看看

不过就是引用了,问题还在参数传递这里

不知道上面那些结构体变量都该给什么值
sdl2005lyx 2011-11-01
  • 打赏
  • 举报
回复
"楼下兄弟,那个组件在哪里,没有找到",
你现在使用这个函数,总有个dll,你看看这个dll是com组件,还是普通的动态库。。。
knet 2011-11-01
  • 打赏
  • 举报
回复
现在主要卡在参数传递

http://msdn.microsoft.com/en-us/library/ms970105.aspx#fedict_regword,让我传递1个指针数组,也就是各位回答的,但是现在给这个数组赋值不知道该赋值多少

网上还没有使用这个函数的任何信息
加载更多回复(7)

111,093

社区成员

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

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

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