小编Joh*_*ica的帖子

如何将Delphi中的UTF-8字符串传递给DLL C extern函数?

我在Delphi中调用Visual Studio编译的DLL中的C extern函数.DLL方法又调用C++方法,该方法将C++字符串类型作为参数.Delphi端的字符串是UTF-8编码的(没有BOM).我需要确保采用字符串类型的C++方法获取UTF-8编码的字符串.

我可以修改DLL源代码.我的问题:

我在Delphi端的UTF-8字符串是string类型.C extern方法应该采用什么类型?PChar,PWideChar?以及如何将其转换为C++字符串类型?

注意:我无法首先将UTF-8字符串转换为AnsiString,因为编码存储了一些必须保留的希腊字母.C++端将复制Delphi字符串并处理任何已分配的内存.

Delphi结束(使用XE6):

mystr : string;

callCExternMethod (mystr) // cast to what?
Run Code Online (Sandbox Code Playgroud)

C++ End(使用VS 2013):

void callCExternMethod (????? mystr) {

  // convert mystr to C++ string type

  callCPlusPlusMethod (takes C++ string type)
}
Run Code Online (Sandbox Code Playgroud)

c delphi string utf-8

2
推荐指数
1
解决办法
992
查看次数

RichEdit不处理超链接

我希望我的RichEdit处理超链接,所以我按照以下说明操作:http://delphi.about.com/od/vclusing/l/aa111803a.htm

以下是我对代码所做的更改:

interface

type
  TProgCorner = class(TForm)
    RichEdit2: TRichEdit;
    RichEdit1: TRichEdit;
    RichEdit3: TRichEdit;
    RichEdit4: TRichEdit;
    procedure FormCreate(Sender: TObject);
  private
    procedure InitRichEditURLDetection(RE: TRichEdit);
  protected
    procedure WndProc(var Msg: TMessage); override;
  end;

implementation

{$R *.DFM}

uses
  ShellAPI, RichEdit;

const
  AURL_ENABLEURL = 1;
  AURL_ENABLEEAURLS = 8;

procedure TProgCorner.InitRichEditURLDetection(RE: TRichEdit);
var
  mask: LResult;
begin
  mask := SendMessage(RE.Handle, EM_GETEVENTMASK, 0, 0);
  //In the debugger mask is always 1, for all 4 Richedits.
  SendMessage(RE.Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK); 
  //returns 67108865
  SendMessage(RE.Handle, EM_AUTOURLDETECT, AURL_ENABLEURL, …
Run Code Online (Sandbox Code Playgroud)

delphi richedit hyperlink

2
推荐指数
1
解决办法
874
查看次数

函数挂钩实际上是如何工作的?WinAPI,C++

我将我的 DLL 注入到一个进程中,然后挂钩这样的函数:(recv)

BOOL HookFunction(LPCWSTR moduleName, LPCSTR funcName, LPVOID funcProxy, 
unsigned char* lpBackup)
{
     BYTE jmp[6] = { 0xe9,0x00,0x00,0x00,0x00,0xc3 };
     DWORD funcAddr = (DWORD)GetProcAddress(GetModuleHandle(moduleName), funcName);

     DWORD prev;
     VirtualProtect((LPVOID)funcAddr, 6, PAGE_EXECUTE_READWRITE, &prev);

     ReadProcessMemory(GetCurrentProcess(), (LPVOID)funcAddr, lpBackup, 6, NULL);

     DWORD proxy = ((DWORD)funcProxy - funcAddr) - 5;
     memcpy(&jmp[1], &proxy, 4);
     memcpy((LPVOID)funcAddr, jmp, 6);

     VirtualProtect((LPVOID)funcAddr, 6, prev, &prev);
     FlushInstructionCache(GetCurrentProcess(), NULL, NULL);

     return funcAddr;
}

// Hook
HookFunction(L"ws2_32.dll", "recv", (LPVOID*)nRecv, hookR);
Run Code Online (Sandbox Code Playgroud)

然后我附加了一个调试器,结果如下:

挂机前: 在此处输入图片说明

上钩后: 在此处输入图片说明

不过,有几件事我不明白,因为我仍在尝试理解和想象堆栈、堆等如何在调试器中协同工作。

BYTE jmp[6] = { 0xe9,0x00,0x00,0x00,0x00,0xc3 };
Run Code Online (Sandbox Code Playgroud)

我是否在这里替换指令,例如,用 0xe9 替换原始函数的“move, edi, …

windows debugging hook code-injection

2
推荐指数
1
解决办法
3502
查看次数

Borland C++:std的歧义(错误E2015)

我一直在Visual Studio 2005中开发一个DLL.目前它编译并完成它应该做的事情.

但是,我想用Borland C++ 2006编译它,因为我听说这样做更好,并且代码更快.当我尝试这样做时,我收到如下错误消息:

E2015 strcmp(const char*,const char*)和std :: strcmp(const char*,const char*)之间的歧义

我已经将strcmp的每个实例更改为std :: strcmp来解决模糊问题并且它可以工作,但我想知道是否有更聪明的方法来实现这一点.

谢谢 :-)

c++ c++builder ambiguity

1
推荐指数
1
解决办法
1559
查看次数

检查RAD studio中的更新时出现问题

我安装了Embarcadero RAD Studio(Delphi 2009).当IDE第一次运行时,它会下载更新并自动运行MSI.无意中我按下了取消,而不是确定.

所以我想重新打开工作室,以便检查更新.但这一次它没有发生!

所以,我从菜单选项中使用了"检查更新".令人惊讶的是它给了我"RAD sudio是最新的".

这些下载的更新文件在系统上的位置是什么?自动下载后这些文件在哪里保存?

delphi delphi-2009

1
推荐指数
2
解决办法
1679
查看次数

Delphi 3到SQL 2008

我的客户有一个用Delphi 3编写的系统,数据库是Paradox.我的工作是将其转换为使用SQL Server 2008.如何使其连接到SQL 2008?我知道,这是很老的东西.我很感激帮助.谢谢

sql-server delphi delphi-3

1
推荐指数
1
解决办法
1875
查看次数

在Codegear RAD Studio中缩进

有没有办法在Codegear RAD Studio IDE中的一个动作中缩进/标注多行?

即我希望能够突出显示多行并同时将它们全部缩进一个标签.

c++ c++builder indentation

1
推荐指数
1
解决办法
877
查看次数

Delphi 6与RAD Studio 2009一起使用

我需要迁移到RAD Studio并将其安装在新工作站上.目前我还需要使用Delphi 6进行开发,直到我们获得所有必要的控制更新并整理出版本控制.

所以我的问题是,我可以在同一台机器上安装Delphi 6,对这两种产品没有任何负面影响吗?

提前致谢.

delphi delphi-2009 delphi-6

1
推荐指数
1
解决办法
269
查看次数

如何在Codegear RAD Studio 2009中创建一个简单的pascal程序?

例如,这个简单的程序:

Program Helloworld;
Begin
  writeln ('Hello world!');
  readln;
End;
Run Code Online (Sandbox Code Playgroud)

delphi

1
推荐指数
1
解决办法
978
查看次数

Delphi 5 IDE命令行返回码

我试图使用MSBuild脚本自动化一些传统的Delphi 5版本,并且在捕获错误时遇到问题.考虑到MSBuild传递存在一些问题,我还尝试了一个批处理文件,当构建失败时(1)我仍然收到反向传递(0).%2是delphi的路径,%3是项目名称.

REM delphi_ide_build.bat
@ECHO OFF
"%1 %2\Bin\delphi32.exe" %3.dpr -b

REM BCB5 returns 0 if build succeeds, 1 if build fails
IF ERRORLEVEL 1 GOTO FAIL
IF ERRORLEVEL 0 GOTO PASS

:FAIL
ECHO An Error Occured in Build - Showing Log
ECHO ---------------------------------------
type %3.err
EXIT 1

:PASS
ECHO The Build Passed - Showing Log
ECHO ------------------------------
type %3.err
EXIT 0
Run Code Online (Sandbox Code Playgroud)

根据在线帮助:

成功构建的错误级别设置为0,失败的构建的错误级别设置为1.

目前我的项目失败(在日志文件中可见)但我的批处理文件作为PASS运行.

[致命错误] MyFile.pas(43):找不到档案:'aa.dcu'

这是Delphi 5中的一个错误,还是我错过了什么?


delphi32.exe上选项-B的完整IDE帮助文本:

的AutoBuild.必须与filename选项一起使用.指定后,IDE启动时会自动构建项目或项目组.然后将任何提示,错误或警告保存到文件中.然后IDE退出.这有助于从批处理文件以批处理模式进行构建.成功构建的错误级别设置为0,失败的构建的错误级别设置为1.默认情况下,输出文件的名称与文件扩展名更改为.err时指定的文件名相同.可以使用o选项覆盖它

delphi batch-file delphi-5

1
推荐指数
1
解决办法
1900
查看次数