Tom*_*y74 5 c delphi pascal header-files
我正在将视频编码器DLL的C头文件转换为Delphi Pascal.
我使用以下函数遇到了一些访问冲突的问题,需要帮助解决这个问题:
h264venc_tt * MC_EXPORT_API h264OutVideoNew(
void * (MC_EXPORT_API * get_rc)(const char* name),
const struct h264_v_settings * set,
int32_t options,
int32_t CPU,
int32_t frame0,
int32_t nframes);
Run Code Online (Sandbox Code Playgroud)
注意:MC_EXPORT_API = cdecl
get_rc声明如下:
// resource functions dispatcher
void * MC_EXPORT_API get_rc(const char* name)
{
if (!strcmp(name, "err_printf"))
return (void*) error_printf;
else if (!strcmp(name, "prg_printf"))
return (void*) progress_printf;
else if (!strcmp(name, "wrn_printf"))
return (void*) warn_printf;
else if (!strcmp(name, "inf_printf"))
return (void*) info_printf;
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
此函数返回指向另一个具有Variable Argument列表的函数的指针.其中一个被声明为:
void error_printf(const char * fmt, ...)
{
char lst[256];
va_list marker;
va_start(marker,fmt);
vsprintf(lst,fmt,marker);
va_end(marker);
printf("%s\n", lst);
}
Run Code Online (Sandbox Code Playgroud)
我已将函数调用和get_rc转换为此Delphi Pascal代码:
PErrorMessageHandler = function (const Name: String): Pointer; cdecl varargs;
function h264OutVideoNew(
get_rc: PErrorMessageHandler;
settings: Ph264_v_settings;
options: int32;
CPU: int32;
frame0: int32;
nFrames: int32
): Pointer; cdecl; external 'mc_enc_avc.dll' index 4;
Run Code Online (Sandbox Code Playgroud)
不幸的是,我不知道如何实现上面显示的C风格方法error_printf.任何人都可以帮我指出正确的方向吗?我也很好奇我是否正确实现了其他功能,因为我在尝试调用该h264OutVideoNew()函数时遇到了访问冲突.
PS!我没有在这篇文章中包含打包记录Th264_v_settings/ P_h264_v_settings因为这很长并且不是真正的问题.
类型的AC参数char*是指向8位字符的以空值终止的数组的指针.在Delphi中,等效类型是PAnsiChar.您无法使用,string因为这是一个在C中没有等效的托管Delphi类型.
另外,错误函数原型具有void返回值.你正在返回一个指针,这是一个错误.
您遇到的更大问题是您无法轻松实现在Delphi中接收可变数量参数的C样式函数.您可以声明并调用此类函数,但无法实现.这意味着具有可变参数的这种函数必须是外部函数.
现在,您可以编写自己的汇编程序来完全填充变量参数.但是,这不是我要采取的路线.我会在C中编写该函数,然后将其编译为.obj文件,该文件可以链接到您的Delphi程序中$LINK.
如果您实际上不需要读取变量参数,则可以忽略它们,如下所示:
TErrorMessageHandler = procedure(Name: PAnsiChar); cdecl;
Run Code Online (Sandbox Code Playgroud)
请注意,我做了以下更改:
T为标准前缀.Name参数的类型.varargs我们无法在Delphi中实现的内容,因此忽略了其他参数.然后导入的函数将如下所示:
function h264OutVideoNew(
get_rc: TErrorMessageHandler;
settings: Ph264_v_settings;
options: int32;
CPU: int32;
frame0: int32;
nFrames: int32
): Pointer; cdecl; external 'mc_enc_avc.dll' index 4;
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样实现错误回调函数:
procedure error_printf(Name: PAnsiChar); cdecl;
begin
// do stuff here
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1965 次 |
| 最近记录: |