Trying to use LimeLM to do Windows shareware subscription; need helpAnswered

As a fellow New Hampshirite I strongly prefer to support Wyatt's superior product. I am sure there is a way to accomplish what I need, but I am having issues.

What I'm trying to do:We are subscriptionizing a piece of Windows shareware software written in Delphi. I want to use FastSpring + LimeLM to do 1-year or 1-month subscriptions. The software needs internet anyway and should always check to see if we've remotely deactivated a license. Our current awful solution permits us neither this capability nor an automated deactivate/reactivate elsewhere capacity for our customers. I want to purchase LimeLM to save me all the emails for manual transfer deactivation + be able to do custom trial extensions.

Problems I am having:1. IsGenuine NEVER seems to return Genuine, even after I have activated. I don't understand the difference bewteen "activated" and "genuine". I want the software never to load past trial unless there is an internet-verified connection to LimeLM server to see that a) license hasn't been manually killed by us b) expiration date isn't in the past.

To activate, my code goes:if TA.CheckAndSavePKey(Trim(sEdit1.Text), TA_SYSTEM) then begin TA.Activate; TAExtraData := TA.GetExtraData; ShowMessage('Product activation successful'); Activated := true;end;

I activate with a test license and I see it appear as activated on LimeLM webpage ("Used activations 1:").

But then I NEVER get IsGenuine to return anything but NotGenuine. Here is my launch code:GRes := TA.IsGenuine(0, 14);TAExtraData := TA.GetExtraData; IsGenuine := (GRes = Genuine) or (GRes = GenuineFeaturesChanged); if not IsGenuine then begin //ALWAYS not genuine, even after activation if TA.IsActivated then begin sMemo1.Lines.Add('This license has expired or been remotely deactivated'); TA.Deactivate(); end; sMemo1.Lines.add('Trial version - unactivated'); try TA.UseTrial(TA_SYSTEM or TA_VERIFIED_TRIAL); DayCount := TA.TrialDaysRemaining(TA_SYSTEM or TA_VERIFIED_TRIAL); SetTrialButton; sMemo1.Lines.Add('Days remaining: '+IntToStr(DayCount)); except on E: ETurboActivateException do begin ShowMessage('Failed to start the trial: ' + E.Message); Application.Terminate; exit; end; end; end else begin sMemo1.Lines.Add('Genuine license'); sMemo1.Lines.Add('License expiration: '+TAExtraData); if TA.IsActivated then sMemo1.Lines.Add('Activated') else sMemo1.Lines.Add('Unactivated'); end;

2. Problem #2 is the GetExtraData doesn't return the expiration date custom license field I am using to do the subscription. After the user enters serial number and successfully activates, it can't just launch the software. It needs to contact LimeLM servers to download the extra field (currently "expires 2019-02-24 19:04:44" in my test case) and check to see if it isn't past. GetExtraData is returning "" - blank string - both right after activation and upon subsequent launches.

3. I want to do everything within my app, but I used TurboActivate.exe just to see if maybe that would trigger Genuine results after activation. When I deactivate and then run TurboActivate.exe, it automatically activates as I click through without ever asking me for a serial number.

I frequently deal with ignorant posts complaining about dysfunctional software when the real problem is user-error. Please excuse me if I am now a guilty party of this, but I've gone through the documentation and I'm pretty sure LimeLM isn't behaving how it should.

Help me get this working and you'll have a new $50/month client for a long time. Thank you!

Wyatt, if you could please reply today indicating whether or not you can help me, that would be great.

If the time isn't worth the money, I understand, but please tell me here you can't help me so I can move to a different product. I'd prefer to use yours.

Right now I am waiting around getting nothing done since I've confirmed there is no further action I can take here. LimeLM isn't behaving how I need it, and I don't see how I'm doing anything wrong.

If you can help me but need more time, please estimate for me how many days I should plan to be working on different things.

Thank you.

>> "TA.IsGenuine(0, 14);"

Don't use 0 days for the days between checks. At a minimum use 1 days. Preferably use the default 90/30 we have in the example. If you use 0 days then you run into a number of problems.

Also, don't mess with your date/time. Again, fraud detection will cause problem (among them saying you're not activated).

Next, try again with our example app. Just change the GUID and nothing else. Do you still get the same results?

How about when you run the TurboActivate Wizard?

>> "2. Problem #2 is the GetExtraData doesn't return the expiration date custom license field I am using to do the subscription. After the user enters serial number and successfully activates, it can't just launch the software."

If you set the license field before the customer activated then they won't need to re-activate to get the latest custom license field.

See: https://wyday.com/limelm/help/license-features/#change

>> "3. I want to do everything within my app, but I used TurboActivate.exe just to see if maybe that would trigger Genuine results after activation. When I deactivate and then run TurboActivate.exe, it automatically activates as I click through without ever asking me for a serial number."

This is by design. Notice the "Deactivate()" function has an erasePkey parameter. If you don't erase the product key then you won't be prompted for a product key (because you've already entered one and TurboActivate knows about it).

Let me know if that helps or if you have any other questions.

Wyatt, thank you so much for your response.

As for #3, you clearly and satisfactorily addressed this confusion which was on my end - I now understand the convenience-design of keeping the key itself but as deactivated for quicker reactivation thereafter.

As for #2, you lead me in the right direction and I now have access from Delphi app to the custom license field. GetExtraData() did indeed and still does return nothing, perhaps by design, but I am now using GetFeatureValue() which works perfectly. Perhaps I confused the function of GetExtraData with GetFeatureValue.

#1 is where I had confusion that I had to resolve myself. I think I have this under control now, but I would like to detail the confusion I had as I can see the attempt to limit IsGenuine() server calls in your documentation as creating a potential point of confusion for new customers.

What told me I could definitively use your excellent product is when I found out calling IsGenuine() by itself with 0 parameters would force an actual internet request/license update.

I when was calling IsGenuine(0, 14) or (1, 14) after activation, I was still getting "NotGenuine" because that was the stored result from the last internet-verified IsGenuine call (another point of confusion is I believe it was waiting 14 days to update when using 0 instead of <0.999 days as I had expected). Then I said to myself, "this is bull - if you can't update the internet-verified license right after activation then the whole thing is useless. My customers can't be waiting an extra 2 weeks to use the software after activation".

That self-statement was made in my ignorance of the forced-update function of just calling IsGenuine() with no parameters, the result of which seems to be locally cached for further internetless, efficient checks until the next internet synch date.

I now call IsGenuine with no parameters (forced update) when:-They have just activated-My first IsGenuine(X, 14) call results in NotGenuine, but we are activated

This properly minimizes bandwidth usage (the first IsGenuine call is a (a few days, 14)) while ensuring we do indeed connect to server forcedly when necessary, such as:1. After activating2. NotGenuine but true=IsActivated

I hope what I've posted prevents similar confusion to other new customers using your product.

Your service is absolutely fantastic. Like my graphics application which LimeLM is currently protecting, yours is a superior quality New Hampshire-developed digital product and I will be sure to recommend it to others.

I currently spend untold amounts of time manually reactivating people's licenses when they need to transfer. This will save me a ton of time and offer better security.

Now I just need to integrate with FastSpring, import existing licenses, and we will be fully operational as a new happy LimeLM user.

Thanks again!Paul

Dear Wyatt, it is now 3 years after I created this thread and I have to confess I continue to have problems with this (this is my new named forum account). I hope you can assist. IsGenuine() doesn't exist in the LimeLM Delphi library. You have to give it a handle. My post above from 3 years ago seems to have prematurely dismissed the issue. I confirm I am getting old, un-updated custom license fields and I need to *FORCE REFRESH* them with a button the user can click. This is for add-on subscriptions after the user has activated the main product. Is there really no way to force-refresh the license fields?

TA.IsGenuine(0,0,true,true) does nothing to refresh the custom license fields. Confusingly there is TA_IsGenuine(Handle: Cardinal) API along with the object-based TA.IsGenuine(int, int, bool, bool) API. I've tried both.

**There is no simple TA_IsGenuine() call in the LimeLM API for Delphi as advertised, to force a refresh**

And if I try to pass TA_IsGenuine(MyForm.TA.Handle), I get a cannot access private symbol error.

TurboActivate has been great for the main licensing of my product. However I have had many difficulties since adding add-on subscriptions almost 2 years ago. I have had to manually intervene on customers' license accounts many times. I believe the non-forced-refresh/update issue here is explanatory of some of these struggles.

Question: How do I **INTERNET-FORCE-UPDATE** the custom license fields of a license with LimeLM TurboActivate Delphi API?

TA_IsGenuine(); = “Not enough actual parameters”

TA_IsGenuine(MyForm.TA.Handle); = “Cannot access private symbol Turboactivate.handle”

MyForm.TA.IsGenuine(0,0,true,true); = Goes through but absolutely fails to update the custom license fields.

Thank you.

, edited
Answer

Hey Paul,

Use the latest version of TurboActivate (4.4.4) with the latest example and integration files for Delphi. The ta.IsGenuine() is there.