我在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) 我希望我的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) 我将我的 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, …
我一直在Visual Studio 2005中开发一个DLL.目前它编译并完成它应该做的事情.
但是,我想用Borland C++ 2006编译它,因为我听说这样做更好,并且代码更快.当我尝试这样做时,我收到如下错误消息:
E2015 strcmp(const char*,const char*)和std :: strcmp(const char*,const char*)之间的歧义
我已经将strcmp的每个实例更改为std :: strcmp来解决模糊问题并且它可以工作,但我想知道是否有更聪明的方法来实现这一点.
谢谢 :-)
我安装了Embarcadero RAD Studio(Delphi 2009).当IDE第一次运行时,它会下载更新并自动运行MSI.无意中我按下了取消,而不是确定.
所以我想重新打开工作室,以便检查更新.但这一次它没有发生!
所以,我从菜单选项中使用了"检查更新".令人惊讶的是它给了我"RAD sudio是最新的".
这些下载的更新文件在系统上的位置是什么?自动下载后这些文件在哪里保存?
我的客户有一个用Delphi 3编写的系统,数据库是Paradox.我的工作是将其转换为使用SQL Server 2008.如何使其连接到SQL 2008?我知道,这是很老的东西.我很感激帮助.谢谢
有没有办法在Codegear RAD Studio IDE中的一个动作中缩进/标注多行?
即我希望能够突出显示多行并同时将它们全部缩进一个标签.
我需要迁移到RAD Studio并将其安装在新工作站上.目前我还需要使用Delphi 6进行开发,直到我们获得所有必要的控制更新并整理出版本控制.
所以我的问题是,我可以在同一台机器上安装Delphi 6,对这两种产品没有任何负面影响吗?
提前致谢.
例如,这个简单的程序:
Program Helloworld;
Begin
writeln ('Hello world!');
readln;
End;
Run Code Online (Sandbox Code Playgroud) 我试图使用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 ×7
c++ ×2
c++builder ×2
delphi-2009 ×2
ambiguity ×1
batch-file ×1
c ×1
debugging ×1
delphi-3 ×1
delphi-5 ×1
delphi-6 ×1
hook ×1
hyperlink ×1
indentation ×1
richedit ×1
sql-server ×1
string ×1
utf-8 ×1
windows ×1