- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 ExportToFileCallback 中,我想使用我在 SaveMsg 中分配的文件,但我似乎无法从指向 FilePCDMsg 的指针中获取它。
type
FilePCDMsg = File of PCDKMsg;
PFilePCDMsg = ^FilePCDMsg;
procedure TfrmMain.SaveMsg( pMsg: PCDKMsg; fn: String = '' );
var
myFile: FilePCDMsg;
pFile : PFilePCDMsg;
begin
if fn.IsEmpty then
fn := TPath.GetTempFileName;
CodeSite.Send( 'SaveMsg fn', fn );
AssignFile( myFile, fn );
Rewrite( myFile );
pFile := Addr( myFile );
CDKMsgExport( pMsg, ExportToFileCallBack, pFile );
end;
function ExportToFileCallBack( pData: PUInt8; len: UInt32; pUser: Pointer ): Integer; cdecl;
var
pFile : PFilePCDMsg;
myFile: FilePCDMsg;
begin
// this is the C code for what I want to do
// return fwrite(pData, 1, len, (FILE*)pUser) == len;
pFile := PFilePCDMsg( pUser );
myFile := FilePCDMsg( pFile ); // will not compile
end;
这个 DLL 是由第三方提供的,它有回调来做事。在这里,我试图查询一个摄像头的配置,回调被调用了三次。我认为它正在将它要我附加到我分配的文件的数据传回给我。
这是我试图在 Delphi 中复制的 C 代码。
#ifdef WIN32
#include <windows.h>
#include "../../include/external/stdint.h"
#include "../../include/external/inttypes.h"
#endif
#ifdef LINUX
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <inttypes.h>
#endif
#include <stdio.h>
#include "../../include/CDK.h"
const char* strAddress = NULL;
uint16_t uPort = 10001;
const char* strOptions = NULL;
const char* strPathOut = ".";
void help()
{
printf("Command line:\n");
printf(" receive address [-port port] [-options options] [-output outputpath]\n");
printf(" Port default value : 10001\n");
printf(" Output path default value : .\n");
}
int parseCommandLine(int argc, char* argv[])
{
int i;
if (argc < 2)
{
return 0;
}
strAddress = argv[1];
for (i=2;i<argc;++i)
{
if (strcmp(argv[i], "-port") == 0)
{
++i;
if (i >= argc)
return 0;
uPort = atoi(argv[i]);
}
else if (strcmp(argv[i], "-options") == 0)
{
++i;
if (i >= argc)
return 0;
strOptions = argv[i];
}
else if (strcmp(argv[i], "-output") == 0)
{
++i;
if (i >= argc)
return 0;
strPathOut = argv[i];
}
}
return 1;
}
void traceCallback(CDK* pSrc, unsigned char level, const char* strTrace, void* pUser )
{
printf("[%u] %s\n", level, strTrace);
}
int32_t exportToFileCallback(const uint8_t* pData, uint32_t len, void* pUser)
{
return fwrite(pData, 1, len, (FILE*)pUser) == len;
}
void parseConfig(CDKMsg *pMsg)
{
CDKMsgElement* pEltConfig = NULL;
CDKMsgElement* pEltDevice = NULL;
CDKMsgElement* pEltCameras = NULL;
const char* str;
uint32_t i = 0;
uint32_t j = 0;
pEltConfig = CDKMsgChild(pMsg);
if(NULL == pEltConfig)
{
return;
}
pEltDevice = CDKMsgElementFirstChild(pEltConfig, "device");
if (NULL != pEltDevice )
{
str = CDKMsgElementAttributeValue(pEltDevice, "name");
if (str)
printf("Name : %s\n", str);
}
pEltCameras = CDKMsgElementFirstChild(pEltConfig, "cameras");
if (NULL != pEltCameras )
{
CDKMsgElement* pEltCamera = CDKMsgElementFirstChild(pEltCameras,NULL);
CDKMsgElement* pEltCameraParam = NULL;
while(pEltCamera)
{
/* camera attributes */
printf("%s : \n", CDKMsgElementName(pEltCamera));
for(i = 0; i < CDKMsgElementAttributeCount(pEltCamera); i++)
{
str = CDKMsgElementAttributeName(pEltCamera,i);
printf("* \t %s : %s\n", str,CDKMsgElementAttributeValue(pEltCamera,str));
}
/* camera parameters */
pEltCameraParam = CDKMsgElementFirstChild(pEltCamera,NULL);
while(pEltCameraParam)
{
printf("* \t %s : \n", CDKMsgElementName(pEltCameraParam));
for(j = 0; j < CDKMsgElementAttributeCount(pEltCameraParam); j++)
{
str = CDKMsgElementAttributeName(pEltCameraParam,j);
printf("** \t\t %s : %s\n", str,CDKMsgElementAttributeValue(pEltCameraParam,str));
}
pEltCameraParam = CDKMsgElementNextChild(pEltCamera,pEltCameraParam,NULL);
}
pEltCamera = CDKMsgElementNextChild(pEltCameras,pEltCamera,NULL);
}
}
}
int main(int argc, char* argv[])
{
CDK* pCDK = NULL;
FILE* pFile = NULL;
char strFileName[256];
CDKMsg * pMsgRequest = NULL;
CDKMsg * pMsgAnswer = NULL;
CDKSetTraceFunction(traceCallback, NULL);
printf("App launched\n");
printf("CDK version : %s\n", CDKGetVersion());
/* command line */
if (!parseCommandLine(argc, argv))
{
help();
return -1;
}
printf("Get config from %s:%u in %s\n", strAddress, uPort, strPathOut);
if (strOptions)
{
printf(" Options : %s\n", strOptions);
}
pCDK = CDKCreate();
if (!CDKBind(pCDK, strAddress, uPort, strOptions))
{
printf("CDKBind failed : %s\n", CDKGetLastError(pCDK));
goto labelEnd;
}
if(!CDKWaitForConnection(pCDK,30000))
{
printf("ERROR : %s\n", CDKGetLastError(pCDK));
goto labelEnd;
}
/* get config */
pMsgRequest = CDKMsgCreate();
CDKMsgSetChild(pMsgRequest, CDKMsgElementCreate("getConfig"));
pMsgAnswer = CDKSendRequest(pCDK, pMsgRequest, 30000);
CDKMsgDestroy(pMsgRequest);
if (NULL == pMsgAnswer )
{
printf("ERROR : %s\n", CDKGetLastError(pCDK));
goto labelEnd;
}
/* export config msg */
sprintf(strFileName, "%s/config.cdkmsg", strPathOut);
pFile = fopen(strFileName, "wb");
if (NULL == pFile)
{
printf("Unable to create output file, does the output path exist?");
goto labelEnd;
}
if (!CDKMsgExport(pMsgAnswer, &exportToFileCallback, pFile))
{
printf("Message export failed : %s", CDKGetLastError(pMsgAnswer));
goto labelEnd;
}
/* Parse config */
parseConfig(pMsgAnswer);
labelEnd:
if (pFile)
{
fclose(pFile);
}
if (pMsgAnswer)
{
CDKMsgDestroy(pMsgAnswer);
}
if (pCDK)
{
CDKDestroy(pCDK);
}
return 0;
}
最佳答案
是我多虑了。答案其实很简单
procedure TfrmMain.SaveMsg(pMsg: PCDKMsg);
begin
CDKMsgExport( pMsg, ExportToFileCallBack, nil );
end;
function ExportToFileCallBack( pData: PUInt8; len: UInt32; pUser: Pointer ): Integer; cdecl;
var
FileName: string;
Stream : TStream;
begin
FileName := 'Config.xml';
if TFile.Exists( FileName ) then
Stream := TFileStream.Create( FileName, fmOpenReadWrite )
else
Stream := TFileStream.Create( FileName, fmCreate );
try
Stream.Seek( 0, soFromEnd );
Stream.WriteBuffer( Pointer( pData )^, len );
CodeSite.SendStreamAsText( 'ExportToFileCallBack', Stream );
finally
Stream.Free;
end;
end;
非常感谢你帮助我
关于c - 如何在 delphi 中创建文件并将其传递给 C DLL 并在回调中使用该文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58707202/
请在标记为重复之前阅读。 我正在创建一组依赖智能卡进行身份验证的应用程序。到目前为止,每个应用程序都单独控制智能卡读卡器。几周后,我的一些客户将同时使用多个应用程序。因此,我认为创建一个控制身份验证过
我想设置一个小程序,从数据库中检索信息,然后根据请求将该信息分发给另一个程序。例如,一个名为“Master”的程序将从数据库中检索数据并创建一个对象集合(列表、数组等,无论哪种效果最好),然后一个名为
我有两台电脑,都装有 XE2。我以为我在两者上安装了相同的安装,但在其中一个上安装第 3 方软件包时遇到问题,而另一个则正常。 无论如何,我希望两者都一样。最简单的人可能只是通过移入我的 Dropbo
有冲突吗? 最佳答案 所有新版本的 Delphi 始终可以安全地安装到旧版本的下一个版本。 每个新版本都应安装在其自己的目录中。 如果您要安装多个版本,请始终先安装最旧的版本,然后再安装最新版本。 我
快速提问:如果我从代码中删除 // 或 (* *) 中的注释,Delphi 2007 的执行时间会受到影响吗?最终结果是一个可能包含数千行注释的 EXE 文件。 最佳答案 编译器会简单地忽略注释,并且
我必须对照另一个文件检查文件的每一行。 如果第二个文件中存在第一个文件中的一行,则必须删除它。 现在,我正在使用2个列表框,并且“对于listbox1.items.count-1可以开始...” 我的
我正在尝试在访问数据库中添加一些数据。但是我有麻烦,因为这会返回错误: ADOQuery1 missing sql property 实现了对代码的几次修改,到目前为止没有任何效果。 我究竟做错了什么
我用Delphi 5编写了一个程序,在Windows 8 32位PC上可以正常运行。我发现在Windows 7 64位笔记本电脑上运行它最终会导致reallocmem错误,而该错误在32位PC上不会发
看来这是我需要的工具,用于提取XML并与TClientDataset连接。我已经在几篇文章和文档中看到了它,但是我无法在XE2组件列表中找到它-在任何地方!应该在哪里?是否在可能未安装的可选软件包中?
我正在寻找一个非常通用的TDBTree组件,我想听听一些建议。我正在特别寻找一种显示主记录和“ n”个链接表记录的记录。 (我的意思是来自各个表的记录)。例如,TDBTree将钩接到主表,明细表1,附
我需要将按钮制作成旋转三角形的形状(或者说是任何多边形)。谁能提供任何建议? 最佳答案 查看Win32 API CreatePolygonRgn()和SetWindowRgn()函数,以创建一个HRG
你好专家 我的JvPasswordForm1有一个旧的JVC组件。 似乎该组件不再存在:它替换为哪个组件? 重新获得 最佳答案 尝试查找TJvLoginDialog,TjvPassword已合并到其中
几天前,我已经设置了我的开发环境(在装有Win 7的VM和域上的用户的VM上安装了delphi 2009),并安装了我的组件(jedi's,devExpress,ADS等)。 今天,我启动机器,打开d
开始对控件进行子分类的正确位置/时间是什么? 恢复原始窗口proc的正确时间是几点? 现在我在表单创建过程中子类化: procedure TForm1.FormCreate(Sender: TObje
有人可以给我一些有关如何登录访问的网页(使用任何网络浏览器)的指示吗?我应该建立一个全球代理....钩住网络....吗?我需要记录的只是页面地址,而不是其中包含的信息。 我正在使用Delphi。 谢谢
我创建了一个像 TMyClass = class(TObject) private FList1: TObjectList; FList2: TObjectList; public end;
我有一个BPG文件,我已对其进行修改以用作我们公司的自动构建服务器的make文件。为了使其正常工作,我必须进行更改 用途*用途 'unit1.pas'中的unit1 * unit1 'unit2.pa
我将Delphi 7代码迁移到了Delphi XE4。我在Delphi XE4的LoadFromStram方法中遇到错误,但对于Delphi 7来说也可以正常工作。 错误: First chance
我正在尝试学习一些新技巧,以便更好地组织我在 Delphi 中的单元中的一些源代码。 我注意到我访问的一些函数或方法似乎是类中的类,但是我还没有成功地在类中创建一个工作类,虽然它编译得很好,但在执行代
我有一个包含许多类的大单元,现在我想通过将某些类分成新的单元来重构该单元。 我不得不承认我缺乏使用Delphi内置IDE功能的经验。利用内置功能“查找|查找对类型的本地引用”并没有多大帮助,因为类方法
我是一名优秀的程序员,十分优秀!