- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果重要的话,我正在使用Delpi XE6。
我正在编写一个 DLL,它将从 Google 的 Directions API 获取响应,解析生成的 JSON 并确定行程的总距离。
GetJSONString_OrDie
按预期工作。它需要一个 URL 并尝试从 Google 获取响应。如果是,它会返回 Google 返回的 JSON 字符串。
ExtractDistancesFromTrip_OrDie
应该接受一个 JSON 字符串,并解析它以获取旅程每段的总距离,并将这些距离粘贴在 double 组中。
SumTripDistances
接受一个 double 组,并对数组求和,然后返回总计。
奇怪的是,如果我从 DLL 中取出这些函数并将它们放入项目中并像这样调用它们,它就会按预期工作。只有当它们卡在 DLL 中时,才会出现问题。如前所述,GetJSONString_OrDie
按预期工作并返回 JSON 字符串 - 但当单步执行 DLL 的 ExtractDistancesForTrip
时,传递的 PChar 字符串为 ''
。这是为什么?
unit Unit1;
interface
uses
IdHTTP,
IdSSLOpenSSL,
System.SysUtils,
System.JSON;
type
arrayOfDouble = array of double;
function GetJSONString_OrDie(url : Pchar) : Pchar;
function ExtractDistancesForTrip_OrDie(JSONstring: Pchar) : arrayOfDouble;
function SumTripDistances(tripDistancesArray: arrayOfDouble) : double;
implementation
{ Attempts to get JSON back from Google's Directions API }
function GetJSONString_OrDie(url : Pchar) : PChar;
var
lHTTP: TIdHTTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
{Sets up SSL}
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
{Creates an HTTP request}
lHTTP := TIdHTTP.Create(nil);
{Sets the HTTP request to use SSL}
lHTTP.IOHandler := SSL;
try
{Attempts to get JSON back from Google's Directions API}
Result := PWideChar(lHTTP.Get(url));
finally
{Frees up the HTTP object}
lHTTP.Free;
{Frees up the SSL object}
SSL.Free;
end;
end;
{ Extracts the distances from the JSON string }
function ExtractDistancesForTrip_OrDie(JSONstring: Pchar) : arrayOfDouble;
var
jsonObject: TJSONObject;
jsonArray: TJSONArray;
numberOfLegs: integer;
I: integer;
begin
//raise Exception.Create('ExtractDistancesForTrip_OrDie:array of double has not yet been '+
// 'implemented.');
jsonObject:= nil;
jsonArray:= nil;
try
{ Extract the number of legs in the trip }
jsonObject:= TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(JSONstring), 0) as TJSONObject;
jsonObject:= (jsonObject.Pairs[0].JsonValue as TJSONArray).Items[0] as TJSONObject;
jsonArray:= jsonObject.Pairs[2].JSONValue as TJSONArray;
numberOfLegs:= jsonArray.Count;
{Resize the Resuls arrayOfDouble}
SetLength(Result, numberOfLegs);
{Loop through the json and set the result of the distance of the leg}
{Distance is in km}
for I := 0 to numberOfLegs-1 do
begin
Result[I]:= StrToFloat((((jsonArray.Items[I] as TJSONObject).Pairs[0].JsonValue as TJSONObject).Pairs[1]).JsonValue.Value);
end;
finally
jsonObject.Free;
jsonArray.Free;
end;
end;
function SumTripDistances(tripDistancesArray: arrayOfDouble) : double;
var
I: integer;
begin
//raise Exception.Create('GetDistanceBetweenPoints_OrDie:double has not yet been ' +
// 'implemented.');
Result:= 0;
{Loop through the tripDistancesArray, and add up all the values.}
for I := Low(tripDistancesArray) to High(tripDistancesArray) do
Result := Result + tripDistancesArray[I];
end;
end.
以下是函数的调用方式:
program Project3;
{$APPTYPE CONSOLE}
{$R *.res}
uses
ShareMem,
IdHTTP,
IdSSLOpenSSL,
System.SysUtils,
System.JSON,
System.Classes;
type
arrayOfDouble = array of double;
testRecord = record
testString : string;
testInt : integer;
end;
function GetJSONString_OrDie(url : Pchar) : PWideChar; stdcall; external 'NMBSGoogleMaps.dll';
function ExtractDistancesForTrip_OrDie(JSONstring: pchar) : arrayOfDouble; stdcall; external 'NMBSGoogleMaps.dll';
function SumTripDistances(tripDistancesArray: arrayOfDouble) : double; stdcall; external 'NMBSGoogleMaps.dll';
var
jsonReturnString: string;
jsonReturnString2: Pchar;
doubles: arrayOfDouble;
totalJourney: double;
uri:Pchar;
a : testRecord;
begin
try
uri:= 'https://maps.googleapis.com/maps/api/directions/json?origin=Boston,MA&destination=Concord,MA&waypoints=Charlestown,MA|Lexington,MA&key=GETYOUROWNKEY';
{ TODO -oUser -cConsole Main : Insert code here }
jsonReturnString:= GetJSONString_OrDie(uri); //On step-through, uri is fine.
jsonReturnString2:= stralloc(length(jsonreturnstring)+1);
strpcopy(jsonreturnstring2, jsonreturnstring);
jsonreturnstring2 := 'RANDOMJUNK';
doubles:= ExtractDistancesForTrip_OrDie(jsonReturnString2); //On step-through, jsonReturnString2 is seen as '', rather than 'RANDOMJUNK'
totalJourney:= SumTripDistances(doubles);
WriteLn('The total journey was: ');
WriteLn(totalJourney);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
readln;
end.
当调用第一个函数GetJSONString_OrDie
时,uri被传入,并且在查看或打印时是正确的。但是,在创建随机字符串并将其传递到 ExtractDistancesForTrip_OrDie
后,该函数只能看到 ''
。如果我要更改 ExtractDistancesForTrip_OrDie
以接受整数、记录或任何内容 - 它会看到垃圾或随机数据。我是否通过引用或值传递并不重要。
最佳答案
您的调用约定不匹配。您的函数使用 register
调用约定,但您可以像 stdcall
一样导入它们。这就是为什么您传递的参数没有到达的原因。
在实现函数和导入函数时都使用stdcall
。
在GetJSONString_OrDie
中,您将返回一个指向局部变量缓冲区的指针。一旦函数返回,该局部变量就会被销毁,并且指针无效。您需要找到一种不同的方法来将字符串数据传递出该函数。
返回一个字符串通常就可以了。但由于该函数是从 DLL 导出的,因此无法工作。您需要一个调用者分配的缓冲区,或者一个在共享堆上分配的缓冲区。
最后,动态数组不是有效的互操作类型。您不应该跨模块边界传递它们。
关于json - Delphi PChar 传递给函数时字符串为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30891803/
最近开始学习MongoDB。今天老师教了我们 mongoexport 命令。在练习时,我遇到了一个典型的问题,包括教练在内的其他同学都没有遇到过。我在我的 Windows 10 机器上使用 Mongo
我是 JSON Schema 的新手,读过什么是 JSON Schema 等等。但我不知道如何将 JSON Schema 链接到 JSON 以针对该 JSON Schema 进行验证。谁能解释一下?
在 xml 中,我可以在另一个 xml 文件中包含一个文件并使用它。如果您的软件从 xml 获取配置文件但没有任何方法来分离配置,如 apache/ngnix(nginx.conf - site-av
我有一个 JSON 对象,其中包含一个本身是 JSON 对象的字符串。我如何反序列化它? 我希望能够做类似的事情: #[derive(Deserialize)] struct B { c: S
考虑以下 JSON { "a": "{\"b\": 12, \"c\": \"test\"}" } 我想定义一个泛型读取 Reads[Outer[T]]对于这种序列化的 Json import
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 11 个月前关闭。 Improve
我的旧项目在 MySQL 中有 Standard JSON 格式的数据。 对于我在 JS (Node.js) 和 DynamoDB 中的全新项目,关于 Standard JSON格式: 是否建议将其转
JSON 值字符串、数字、true、false、null 是否是有效的 JSON? 即,是 true 一个有效的 JSON 文档?还是必须是数组/对象? 一些验证器接受这个(例如 http://jso
我有一个 JSON 字符串,其中一个字段是文本字段。这个文本字段可以包含用户在 UI 中输入的文本,如果他们输入的文本是 JSON 文本,也许是为了说明一些编码,我需要对他们的文本进行编码,以便它不会
我正在通过 IBM MQ 调用处理数据,当由 ColdFusion 10 (10,0,11,285437) 序列化时,0 将作为 +0.0 返回,它会导致无效的 JSON并且无法反序列化。 stPol
我正在从三个数组中生成一个散列,然后尝试构建一个 json。我通过 json object has array 成功了。 require 'json' A = [['A1', 'A2', 'A3'],
我从 API 接收 JSON,响应可以是 30 种类型之一。每种类型都有一组唯一的字段,但所有响应都有一个字段 type 说明它是哪种类型。 我的方法是使用serde .我为每种响应类型创建一个结构并
我正在下载一个 JSON 文件,我已将其检查为带有“https://jsonlint.com”的有效 JSON 到文档目录。然后我打开文件并再次检查,结果显示为无效的 JSON。这怎么可能????这是
我正在尝试根据从 API 接收到的数据动态创建一个 JSON 对象。 收到的示例数据:将数据解码到下面给出的 CiItems 结构中 { "class_name": "test", "
我想从字符串转换为对象。 来自 {"key1": "{\n \"key2\": \"value2\",\n \"key3\": {\n \"key4\": \"value4\"\n }\n
目前我正在使用以下代码将嵌套的 json 转换为扁平化的 json: import ( "fmt" "github.com/nytlabs/gojsonexplode" ) func
我有一个使用来自第三方 API 的数据的应用程序。我需要将 json 解码为一个结构,这需要该结构具有“传入”json 字段的 json 标签。传出的 json 字段具有不同的命名约定,因此我需要不同
我想使用 JSON 架构来验证某些值。我有两个对象,称它们为 trackedItems 和 trackedItemGroups。 trackedItemGroups 是组名称和 trackedItem
考虑以下案例类模式, case class Y (a: String, b: String) case class X (dummy: String, b: Y) 字段b是可选的,我的一些数据集没有字
我正在存储 cat ~/path/to/file/blah | 的输出jq tojson 在一个变量中,稍后在带有 JSON 内容的 curl POST 中使用。它运作良好,但它删除了所有换行符。我知
我是一名优秀的程序员,十分优秀!