|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
whsky (板凳上的钉子) |
★☆☆☆☆ |
-
|
普通会员 |
|
2008/5/3 9:58:37 |
标题: |
请问delphi的窗口句柄类型是什么 |
浏览:1899 |
|
加入我的收藏 |
楼主: |
我现在要调用VC++写的DLL,函数在VC++中的定义为 extern "C" __declspec(dllexport) bool StartCom(CWnd *MainDlg);
那么我在DELPHI中调用应该如何声明,谢谢
----------------------------------------------
我是带着问题来的 |
作者: |
whsky (板凳上的钉子) |
★☆☆☆☆ |
-
|
普通会员 |
|
2008/5/3 10:29:40 |
1楼: |
不会没人知道吧
----------------------------------------------
我是带着问题来的
|
作者: |
|
2008/5/3 10:46:22 |
2楼: |
Delphi的VCL类库和VC的MFC类库根本是两个不同的类型,你上面的VC函数Delphi没办法调用(就算可以,好像工作量也很大,至少我是没办法:P)。
----------------------------------------------
|
作者: |
|
2008/5/3 11:00:36 |
3楼: |
extern "C" __declspec(dllexport) bool StartCom(CWnd *MainDlg);
-->delphi:
function StartCom(Awnd:Handle): Boolean; cdecl; or function StartCom(Awnd:Integer): Boolean; cdecl;
or
function StartCom(Awnd:HWND): Boolean; cdecl;
----------------------------------------------
-
|
作者: |
whsky (板凳上的钉子) |
★☆☆☆☆ |
-
|
普通会员 |
|
2008/5/3 11:01:38 |
3楼: |
调用可以,只是不知道这个窗口句柄在DELPHI应该是什么样的
----------------------------------------------
我是带着问题来的
|
作者: |
whsky (板凳上的钉子) |
★☆☆☆☆ |
-
|
普通会员 |
|
2008/5/3 11:14:50 |
4楼: |
donghaixiaoxiao 谢谢你,非常感谢
----------------------------------------------
我是带着问题来的
|
作者: |
|
2008/5/3 11:17:58 |
4楼: |
其实句柄在VC里只是一个 Dword,你在VC里看看CWnd的原型,可能就是CWnd=Dword, 所以在Delphi里,也是这么声明的: HWND = type LongWord; THandle = LongWord;
我上面用 function StartCom(Awnd:Integer): Boolean; cdecl;其实不严谨,其实用 longword最好。
不过既然Delphi里定义有Hwnd,或者Thandle那么就这么用就可以了,反正都是longword, 至于为什么,那就是不为什么了,其实只是两种不同编译器之间类型定义的不同转换
Delphi的窗口句柄最好用Thandle。 更符合delphi习惯
----------------------------------------------
-
|
作者: |
|
2008/5/3 11:47:46 |
5楼: |
CWnd不是窗口句柄啊,是MFC类的CWnd类指针,HWND才是窗口句柄。而Delphi不支持MFC类,没办法构造一个MFC类指针给这个函数,所以Delphi才没办法调用啊。如果CWnd是窗口句柄就好办了,在Delphi直接用THandle类型就行了。
----------------------------------------------
|
作者: |
|
2008/5/3 12:02:17 |
6楼: |
CWnd是MFC的类对象,"CWnd *MainDlg"的参数意思就和Delphi的"MainDlg:TForm"参数是一样的,只是CWnd和TForm的内部结构位置是不一样的,不兼容的,所以我才说Delphi没办法“正确”调用这个函数,因为Delphi不支持MFC类库对象,如果你真的要在Delphi中调用这个函数,那就必须在Delphi中构造一个和VC的MFC类库一样的CWnd类才行,不过那个工作量太大了。
----------------------------------------------
|
作者: |
whsky (板凳上的钉子) |
★☆☆☆☆ |
-
|
普通会员 |
|
2008/5/3 12:05:10 |
6楼: |
那应该怎么做,总该有办法的,还请多多指教,再复杂也行,只要能实现
----------------------------------------------
我是带着问题来的
|
作者: |
whsky (板凳上的钉子) |
★☆☆☆☆ |
-
|
普通会员 |
|
2008/5/3 12:08:57 |
7楼: |
天啦,这个也太......
----------------------------------------------
我是带着问题来的
|
作者: |
|
2008/5/3 12:16:29 |
8楼: |
不过,如果你懂你VC的话,你只需重新写出一个Dll,在VC的Dll中调用这个函数,并将这个函数再输出让Delphi调用就行了,只是有一点不好,就是必须在VC的Dll中初始化CWnd类参数,无法在Delphi初始化这个参数。
----------------------------------------------
|
作者: |
|
2008/5/3 16:30:10 |
9楼: |
如果有时间和精力的话,可以把CWnd及其基类用到的头文件afx.h,afxwin.h由C++代码转换成Pascal代码,再进行调用.
----------------------------------------------
-
|
作者: |
|
2008/5/3 16:42:11 |
10楼: |
faint
----------------------------------------------
|
作者: |
|
2008/5/3 20:03:23 |
11楼: |
好贴啊 不错啊 谢谢楼主分享 拉 (*^__^*) 嘻嘻…… ---------- 客户:你们三角洲里的盟军2玩不了!申请虚拟主机客服:??!!请问是什么盘? 客户:藏经阁。域名注册客服:555~
----------------------------------------------
-
|
作者: |
whsky (板凳上的钉子) |
★☆☆☆☆ |
-
|
普通会员 |
|
2008/5/3 20:55:33 |
12楼: |
非常感谢各位,看来我只有先用XIAOPEI的办法实现下了,有好结果,随时与各位分享
----------------------------------------------
我是带着问题来的
|
|