请求将MSDN中DirectShow的COM支持C++代码转为Delphi
Delphi下DirectShow COM支持代码转换方案
报错信息翻译
这是一个字符串,但你将它定义为WCHAR类型。
1. WCHAR类型字符串转换
C++里的WCHAR[]宽字符数组,在Delphi中直接用PWideChar常量即可,Delphi会自动处理宽字符编码,无需手动声明数组:
const g_wszName: PWideChar = 'My RLE Encoder';
如果要完全匹配C++的静态数组写法,也可以这么定义:
const g_wszName: array[0..12] of WideChar = ('M','y',' ','R','L','E',' ','E','n','c','o','d','e','r',#0);
2. CFactoryTemplate结构体定义与数组转换
先在Delphi中定义和C++ CFactoryTemplate 完全匹配的结构体,再转换模板数组:
// 定义CreateInstance函数的类型,匹配DirectShow的COM创建签名 type TCreateInstanceFunc = function(UnkOuter: IUnknown; out hr: HResult): IUnknown; stdcall; // 对应C++的CFactoryTemplate结构体 TCFactoryTemplate = record m_Name: PWideChar; // 过滤器名称 m_Clsid: TCLSID; // 过滤器的CLSID m_CreateInstance: TCreateInstanceFunc; // 实例创建回调函数 m_pUnk: IUnknown; // 聚合用IUnknown指针(通常为nil) m_pSetupData: PAMOVIESETUP_FILTER; // 过滤器注册信息(通常为nil) end; // 转换后的模板数组 const g_wszName: PWideChar = 'My RLE Encoder'; var g_Templates: array[0..0] of TCFactoryTemplate = ( ( m_Name: g_wszName; m_Clsid: CLSID_RLEFilter; m_CreateInstance: @CRleFilter.CreateInstance; // 取类方法地址 m_pUnk: nil; m_pSetupData: nil ) );
注意:CRleFilter.CreateInstance 必须是符合TCreateInstanceFunc签名的类方法,调用约定需为stdcall。
3. 数组元素个数计算
C++中通过sizeof计算数组长度的逻辑,在Delphi中直接用Length函数即可,它会自动返回数组的元素个数:
var g_cTemplates: Integer = Length(g_Templates);
内容的提问来源于stack exchange,提问作者Legat
相关产品推荐
相关产品推荐

