Delphi:使用 DDE 从 MSEdge 获取当前 URL (Window 10 22H2)

问题描述 投票:0回答:1

我想将下面用C++编写的函数转换为Delphi。 C++ 源代码来自 https://github.com/aardappel/procrastitracker,位于文件

ddeutil.h
timercallback.h
:

DWORD idInst = 0;
HDDEDATA CALLBACK DdeCallback(UINT uType, UINT uFmt, HCONV hconv, HSZ hsz1, HSZ hsz2,
                              HDDEDATA hdata, DWORD dwData1, DWORD dwData2) {
    return 0;
}
bool ddeinit() {
    return DdeInitialize(&idInst, (PFNCALLBACK)DdeCallback, APPCLASS_STANDARD | APPCMD_CLIENTONLY,
                         0) == DMLERR_NO_ERROR;
}
void ddeclean() {
    if (idInst) DdeUninitialize(idInst);
}

void ddereq(char *server, char *topic, char *item, char *buf, int len) {
    buf[0] = 0;
    HSZ hszApp = DdeCreateStringHandleA(idInst, server, 0);
    HSZ hszTopic = DdeCreateStringHandleA(idInst, topic, 0);
    HCONV hConv = DdeConnect(idInst, hszApp, hszTopic, NULL);
    DdeFreeStringHandle(idInst, hszApp);
    DdeFreeStringHandle(idInst, hszTopic);
    if (hConv == NULL) {
        // OutputDebugF("dde error: %x\n", DdeGetLastError(idInst));
        // DMLERR_NO_CONV_ESTABLISHED on chrome, see
        // https://bugs.chromium.org/p/chromium/issues/detail?id=70184
        return;
    }

    HSZ hszItem = DdeCreateStringHandleA(idInst, item, 0);
    HDDEDATA hData =
        DdeClientTransaction(NULL, 0, hConv, hszItem, CF_TEXT, XTYP_REQUEST, 5000, NULL);
    if (hData != NULL) {
        DdeGetData(hData, (unsigned char *)buf, len, 0);
        buf[len - 1] = 0;
        DdeFreeDataHandle(hData);
    } else {
        // OutputDebugF("dde error: %x\n", DdeGetLastError(idInst));
    }

    DdeFreeStringHandle(idInst, hszItem);

    DdeDisconnect(hConv);
}

使用

ddereq()
函数从 MSEdge 获取 URL(C++ 语言):

ddereq("msedge", "WWW_GetWindowInfo", "0xFFFFFFFF", url, MAXTMPSTR);

我将这些函数转换为Delphi:

var idInst : LongInt=0;

function DDECallback(CallType, Fmt: UINT; Conv: HConv; hsz1, hsz2: HSZ;
    Data: HDDEData; Data1, Data2: DWORD): HDDEData; stdcall;
begin
   Result:=0;
end;

function ddeinit:Boolean;
begin
    Result:=DdeInitializeA(idInst, @DDECallback, APPCLASS_STANDARD or APPCMD_CLIENTONLY,0)=DMLERR_NO_ERROR;
end;

procedure ddeclean;
begin
    if idInst<>0 then DdeUninitialize(idInst);
end;

procedure ddereq(server, topic, item : PAnsiChar;var Buff:String);
var
  hszApp,
  hszTopic : THandle;
  hConv    : THandle;
  hszItem  : THandle;
  hData    : HDDEDATA;
begin    
    hszApp := DdeCreateStringHandleA(idInst, server, 0);
    hszTopic := DdeCreateStringHandleA(idInst, topic, 0);
    hConv := DdeConnect(idInst, hszApp, hszTopic, nil);
    DdeFreeStringHandle(idInst, hszApp);
    DdeFreeStringHandle(idInst, hszTopic);
    if hConv = 0 then begin exit; end;

    hszItem := DdeCreateStringHandleA(idInst, item, 0);
    hData :=  DdeClientTransaction(nil, 0, hConv, hszItem, CF_TEXT, XTYP_REQUEST, 5000, nil);
    if hData <> 0 then begin
        DdeGetData(hData,@buff, SizeOf(Buff), 0);
        DdeFreeDataHandle(hData);
    end else ;

    DdeFreeStringHandle(idInst, hszItem);
    DdeDisconnect(hConv);

end;

我使用

ddereq()
函数从 MSEdge(在 Delphi 中)获取 URL:

ddereq('msedge', 'WWW_GetWindowInfo', '0xFFFFFFFF', url);

但该函数始终返回空白 URL,因为

DdeConnect()
在此行始终返回 0:

hConv := DdeConnect(idInst, hszApp, hszTopic, nil);

请帮我修复 Delphi 中的这些功能。

delphi url dde
1个回答
0
投票

[@RemyLebeau:我没有从 C++ 源代码进行编译,因为我没有使用 C++ 编译器。我从作者的网站下载了该应用程序: https://strlen.com/procrastitracker。 这个应用程序运行得很好,我刚刚在我的电脑上测试过。我已经看到它在我的 msedge 和 chrome 浏览器上显示了正确的网站标题和 URL。]2

© www.soinside.com 2019 - 2024. All rights reserved.