|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2019/6/13 17:26:08 |
标题: |
求一行C++代码转Delphi,只有一行。 |
浏览:1472 |
|
加入我的收藏 |
楼主: |
typedef __declspec(dllexport) unit(*MTManagerCreateExt_t) (UINT api_version,LPCWSTR datapath,IMTManagerAPI **manager);
----------------------------------------------
- |
作者: |
|
2019/6/13 22:22:03 |
1楼: |
无解,就这点信息
----------------------------------------------
-世上本没有完美的东西,我们只能适应不完美,追求完美
|
作者: |
|
2019/6/13 23:04:28 |
2楼: |
我看明白了,但我不会DELPHI。。。。
----------------------------------------------
C++ builder 用户前来摸鱼。。。
|
作者: |
|
2019/6/13 23:08:02 |
3楼: |
typedef __declspec(dllexport),在DLL中定义一个函数 unit(*MTManagerCreateExt_t) 这是函数的返回值,本来是*MTManagerCreateExt_t类型,但是被强转成了 UINT 类型
(UINT api_version,LPCWSTR datapath,IMTManagerAPI **manager); 这是函数的参数列表,有3个参数,第一个UINT类型的api_version,第二个LPCTSTR类型的datapath,LPCTSTR就是const wchar_t* 类型,第三个IMTManagerAPI **manager,IMTManagerAPI类型的二级指针,这种指针的用途一般是传指针的地址过去
完毕
----------------------------------------------
C++ builder 用户前来摸鱼。。。
|
作者: |
|
2019/6/13 23:09:06 |
4楼: |
LPCTSTR,说错了,如果工程是UNICODE的,那他就是const wchar_t*,如果是多字节或者ansi的工程,那他就是const char*
----------------------------------------------
C++ builder 用户前来摸鱼。。。
|
作者: |
|
2019/6/13 23:09:35 |
5楼: |
LPCWSTR 看错了,那必须是 const wchar_t* 最近眼瞎。。。
----------------------------------------------
C++ builder 用户前来摸鱼。。。
|
作者: |
|
2019/6/14 9:43:36 |
6楼: |
typedef __declspec(dllexport) uINT(*MTManagerCreateExt_t) (UINT api_version,LPCWSTR datapath,IMTManagerAPI **manager);
这是定义了一个函数指针类型 MTManagerCreateExt_t, 转换成Dephi的话大约是
type MTManagerCreateExt_t = function(api_version: Cardinal; const datapath: PWideChar; manager: Pointer): Cardinal;
2楼把函数指针类型 和返回类型搞混了。
----------------------------------------------
-
|
作者: |
|
2019/6/14 11:00:13 |
7楼: |
type MTManagerCreateExt_t = function(api_version: UINT; const datapath: LPWSTR; out manager: IMTManagerAPI): UINT;
----------------------------------------------
--
|
作者: |
|
2019/6/14 19:29:28 |
8楼: |
6楼7楼差不多是这么个意思,我目前也是这么转的。TMTManGetInterfaceExt = function( Version: DWORD; datapath: PWideChar; var manager: IManagerInterface): DWORD; cdecl;
但是存在个问题,获取的输出接口(manager)不对.在C++里则可以使用。
主要是和这个有关:__declspec(dllexport)
----------------------------------------------
-
|
作者: |
|
2019/6/14 19:29:48 |
9楼: |
__declspec(dllexport) 这句没有相应的转过来
----------------------------------------------
-
|
作者: |
|
2019/6/14 22:08:41 |
10楼: |
在函数定义之后加cdecl
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
|
作者: |
|
2019/6/14 23:47:59 |
11楼: |
C++ 和 Delphi各自编译器的对像模型 (Object Model) 不是二进制兼容的 i.e., not Application Binary Interface (ABI) compatible.
你用Delphi 跨越 DLL boundary, 调用 一个返回 C++ 类指针的函数, 一般是不可行的。只有在极少数的情况下,用一些 hacking trick 才可以, 比如Delphi 和C++的类同时声明为纯虚类, 这时候,二者的Virtual Method Table (VMT) 才是二进制兼容的。
你可以想办法 用COM 或 COM-Like (COM lite)的方式,实现你想要的 Delphi-C++ 互操作。或者对C++类做 进一步的 C-Style DLL包装。
----------------------------------------------
-
|
|