给点建议:一家大公司欲收购我编写的一个软件,我该如何保护自己的权益?(100分)

  • 主题发起人 Qingzhong
  • 开始时间
Q

Qingzhong

Unregistered / Unconfirmed
GUEST, unregistred user!
我化了5年时间做了的一个某行业的管理软件,现在有一定的客户群,软件售价一般在10万
--20万。但我属技术类,不属于商人类,不会也不愿意做市场,客户都是慕名自己找上门来
的,所以软件的推广进行得十分缓慢。现在有一家大公司(程序员有一百多号人)也想进入这
一行业,但他们没有产品,所以想收购我的产品以便能快速进入此行业,我也看重他们分布全
国的营销网络。为此,提出了三种合作方案:
1.OEM贴牌。他们每卖出一个,我就给他们提供一个,供货价格一个一议,需要贴上他们
的“商标”。但我的那点加密措施,对付普通客户还行,但一家大公司想要破解一定就能破解,
在这个缺乏诚信的时代,又没有完善的软件著作权保护,我怎么能信得过他们?等学会了核心
流程,还不一脚把我踹了!最起码他们可以换一个前端和后台,再重新开发一个,不算侵权了
吧?
2.完全收购。此方案是我提出来的。我将源代码交出,到他们公司当该项目技术总监,告
诉他们核心流程,直到他们换前端和后台的开发工作完成(因为我的程序是VFP编写的)。但
他们认为一次性卖断对他们来说,市场风险太大,也怕我以后甩手不管,所以他们不干。
3.技术参股。还是我将源代码交出,到他们公司当该项目技术总监。开始阶段以我编写的
软件打市场,等以后有大客户,我的软件不能适应的时候,再指导他们的程序员换平台开发新
软件。这一项目实行独立核算,我从项目收益中分成。但这一方案对他们来说是太好了,不投
入任何资源,就可得到我的源代码,要是他们在市场开发上不积极投入,我就算死在那儿了,
如果市场开发工作做的好,我的软件仅仅是ERP中的一部分,需要与其它模块捆绑,那么总价
格中有多少可以算是我这个项目组的?将来换平台开发后,我怎么分成?他们的理由是这么做
可以保证双方共同努力,因为我的收益是与将来该项目的业绩挂钩的,我不会甩手不管。
请帮我参谋一下,提出一个更好的方案,既能保障我的权益,又能为他们所认可。特别是
有类似经历的dfw,请多提宝贵意见。
因为这5年来,我在凌晨2点之前睡觉的概率为1%,我一生黄金岁月的心血结晶就是这一软
件了。
 
现在的软件有没有专利权?
 
我没有类似经历(还是菜鸟),不过我觉得应该先让他们买N套(保证你5年来的基本收益),
然后OEM贴牌。至于破解问题,我想只要人家想破,就没有破不了的。
 
你没有想过提成吗?每卖出一套你的产品,你可以提成 销售额的 百分之几 呀!
你可以做他们的技术支持,没必要正式加入他们公司呀!
而且为了方便你自己,可以在他们公司中培训几个人来帮助维护一些简单的配置问题,
如果需要修改的话,你还可以按 难度和 工作量 收取一定的费用呀!
这样 大家都好 何乐而不为,当你赚够了还可以当当好人,把源代码送给他们,
也许那是他们还会很感激你的。
 
>>因为这5年来,我在凌晨2点之前睡觉的概率为1%,我一生黄金岁月的心血结晶就是这一软
件了。
说得太吓人了,所以大家也就不敢给你回复了。
xixi
放松,放松。^_^
 
5年?天,什么软件!我觉得可以自己找个大财主资金入股,自己当老板![:)]
 
软件这个东西,没有多少能够保得住秘密的。该挣的钱挣到手就行了,因为这东西别人也
能够做出来,只是时间问题。一旦别人也有了,你的程序还值钱吗?
 
是什么东东呀?这么值钱,
 
还是让他们买断吧,价格适当一点,以后省事。
 
我的经历和你类似。自己写医院系统已经6年了. 中间总有人想和我合伙。也有人提出
资助或收购。 多数条件都很苛刻。 思来想去。我还是自己干。
想交流经验吗? mailto:whs@bj99.net
 
那就是做代理了
在软件里加注册机制吧,一般做法都用识别硬盘序列号
因为这样电脑再升级机器都认识
这样就保证了每台机器只能装一套
这是我的一个很简陋的加密算法没什么参考意义
你看怎么取硬盘序列号就是了
//以下是取硬盘序列号过程
procedure Tfmmain.Timer1Timer(Sender: TObject);
var
DSSER,dsser1,dsser2,dsser3:string;
mp,i,lc:integer;
a1,s:array [0..25] of string;
SerialNum : dword;
aX, bX : dword;
Buffer : array [0..255] of char;
begin

CSER:='';
while CSER='' do
begin
IF GetVolumeInformation('c:/', Buffer, SizeOf(Buffer), @SerialNum, aX, bX, nil, 0) then
CSER:=IntToStr(SerialNum);
end;

//以下是注册窗口的代码也就是加解密算发 没什么多大意义只是喝喝一般人
你自己写算法吧,可以将ASC编号上做运算这里就不多说了,再加一串随机哄人
随机数所在的位数要根据序列号变才能喝住人的,以下的看了也没多大用最多笑话
我一下.还是让别人买断比较好一些,
unit ureg;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Mask, DBCtrls, wtjDBEdit,tables,MAIN,wel;
type
Tfmreg = class(TForm)
userco: TwtjDBEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
reged: TwtjDBEdit;
okbt: TButton;
cabt: TButton;
Label4: TLabel;
noed: TwtjDBEdit;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Button1: TButton;
procedure formshow(Sender: TObject);
procedure okbtClick(Sender: TObject);
procedure cabtClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure usercoExit(Sender: TObject);
procedure noedExit(Sender: TObject);
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
fmreg: Tfmreg;
serino:string;
nnn:boolean;
implementation
uses login;
{$R *.DFM}
procedure Tfmreg.formshow(Sender: TObject);
var
DSSER,dsser1,dsser2,dsser3:string;
mp,i,lc:integer;
a1,s:array [0..25] of string;
begin

dm1.tbreg.Open;
lc:=length(CSER);
//第一种情况;
dsser1:='';
mp:=0;
for i:=1 to lc do
begin
a1:=copy(Cser,i,1);
s:='7';
if (a1='0') and (mp=0) then
s:='A';
if (a1='1') and (mp=1) then
s:='B';
if (a1='2') and (mp=2) then
s:='C';
if (a1='3') and (mp=0) then
s:='D';
if (a1='4') and (mp=1) then
s:='E';
if (a1='5') and (mp=2) then
s:='F';
if (a1='6') and (mp=0) then
s:='G';
if (a1='7') and (mp=1) then
s:='H';
if (a1='8') and (mp=2) then
s:='I';
if (a1='9') and (mp=0) then
s:='J';
if (a1='0') and (mp=1) then
s:='K';
if (a1='1') and (mp=2) then
s:='L';
if (a1='2') and (mp=0) then
s:='M';
if (a1='3') and (mp=1) then
s:='N';
if (a1='4') and (mp=2) then
s:='O';
if (a1='5') and (mp=0) then
s:='P';
if (a1='6') and (mp=1) then
s:='Q';
if (a1='7') and (mp=2) then
s:='R';
if (a1='8') and (mp=0) then
s:='S';
if (a1='9') and (mp=1) then
s:='T';
if (a1='0') and (mp=2) then
s:='U';
if (a1='1') and (mp=0) then
s:='V';
if (a1='2') and (mp=1) then
s:='W';
if (a1='3') and (mp=2) then
s:='X';
if (a1='4') and (mp=0) then
s:='Y';
if (a1='5') and (mp=1) then
s:='Z';
if (a1='6') and (mp=2) then
s:='3';
if (a1='7') and (mp=0) then
s:='4';
if (a1='8') and (mp=1) then
s:='5';
if (a1='9') and (mp=2) then
s:='6';
dsser1:=dsser1+s;
end;

//第二种情况;
dsser2:='';
mp:=0;
for i:=1 to lc do
begin
a1:=copy(Cser,i,1);
s:='7';
if (a1='0') and (mp=0) then
s:='A';
if (a1='1') and (mp=1) then
s:='B';
if (a1='2') and (mp=2) then
s:='C';
if (a1='3') and (mp=0) then
s:='D';
if (a1='4') and (mp=1) then
s:='E';
if (a1='5') and (mp=2) then
s:='F';
if (a1='6') and (mp=0) then
s:='G';
if (a1='7') and (mp=1) then
s:='H';
if (a1='8') and (mp=2) then
s:='I';
if (a1='9') and (mp=0) then
s:='J';
if (a1='0') and (mp=1) then
s:='K';
if (a1='1') and (mp=2) then
s:='L';
if (a1='2') and (mp=0) then
s:='M';
if (a1='3') and (mp=1) then
s:='N';
if (a1='4') and (mp=2) then
s:='O';
if (a1='5') and (mp=0) then
s:='P';
if (a1='6') and (mp=1) then
s:='Q';
if (a1='7') and (mp=2) then
s:='R';
if (a1='8') and (mp=0) then
s:='S';
if (a1='9') and (mp=1) then
s:='T';
if (a1='0') and (mp=2) then
s:='U';
if (a1='1') and (mp=0) then
s:='V';
if (a1='2') and (mp=1) then
s:='W';
if (a1='3') and (mp=2) then
s:='X';
if (a1='4') and (mp=0) then
s:='Y';
if (a1='5') and (mp=1) then
s:='Z';
if (a1='6') and (mp=2) then
s:='3';
if (a1='7') and (mp=0) then
s:='4';
if (a1='8') and (mp=1) then
s:='5';
if (a1='9') and (mp=2) then
s:='6';
dsser2:=dsser2+s;
end;

//第三种情况;
dsser3:='';
mp:=2;
for i:=1 to lc do
begin
a1:=copy(Cser,i,1);
s:='7';
if (a1='0') and (mp=0) then
s:='A';
if (a1='1') and (mp=1) then
s:='B';
if (a1='2') and (mp=2) then
s:='C';
if (a1='3') and (mp=0) then
s:='D';
if (a1='4') and (mp=1) then
s:='E';
if (a1='5') and (mp=2) then
s:='F';
if (a1='6') and (mp=0) then
s:='G';
if (a1='7') and (mp=1) then
s:='H';
if (a1='8') and (mp=2) then
s:='I';
if (a1='9') and (mp=0) then
s:='J';
if (a1='0') and (mp=1) then
s:='K';
if (a1='1') and (mp=2) then
s:='L';
if (a1='2') and (mp=0) then
s:='M';
if (a1='3') and (mp=1) then
s:='N';
if (a1='4') and (mp=2) then
s:='O';
if (a1='5') and (mp=0) then
s:='P';
if (a1='6') and (mp=1) then
s:='Q';
if (a1='7') and (mp=2) then
s:='R';
if (a1='8') and (mp=0) then
s:='S';
if (a1='9') and (mp=1) then
s:='T';
if (a1='0') and (mp=2) then
s:='U';
if (a1='1') and (mp=0) then
s:='V';
if (a1='2') and (mp=1) then
s:='W';
if (a1='3') and (mp=2) then
s:='X';
if (a1='4') and (mp=0) then
s:='Y';
if (a1='5') and (mp=1) then
s:='Z';
if (a1='6') and (mp=2) then
s:='3';
if (a1='7') and (mp=0) then
s:='4';
if (a1='8') and (mp=1) then
s:='5';
if (a1='9') and (mp=2) then
s:='6';
dsser3:=dsser3+s;
end;
dsser:=dsser1;
if dm1.tbreg['serno']=dsser1 then
dsser:=dsser1;
if dm1.tbreg['serno']=dsser2 then
dsser:=dsser2;
if dm1.tbreg['serno']=dsser3 then
dsser:=dsser3;
dm1.tbreg.edit;
dm1.tbreg['serno']:=dsser;
dm1.tbreg.post;
LABEL7.Caption:=dsser;
end;

procedure Tfmreg.okbtClick(Sender: TObject);
VAR
MM:STRING;
i,lc:integer;
a,s:array [0..25] of string;
passd:string;
p2,p3,p4,p5,p6,p7:string;
begin
IF (TRIM(NOED.Text)='') OR (TRIM(USERCO.Text)='') then
begin
MessageBox(handle,Pchar('请完整填写注册信息'),'注册信息',0+48);
exit;
end;

lc:=length(LABEL7.Caption);
mm:='';
for i:=1 to lc do
begin
a:=copy(LABEL7.Caption,i,1);
s:='*';
if ((a='A') OR (A='K' )) OR (A='U') then
s:='0';
if ((a='B') OR (A='L')) OR (A='V') then
s:='1';
if ((a='C') OR (A='M' )) OR (A='W') then
s:='2';
if ((a='D') OR (A='N' )) OR (A='X') then
s:='3';
if ((a='E') OR (A='O' )) OR (A='Y') then
s:='4';
if ((a='F') OR (A='P' )) OR (A='Z') then
s:='5';
if ((a='G') OR (A='Q' )) OR (A='3') then
s:='6';
if ((a='H') OR (A='R' )) OR (A='4') then
s:='7';
if ((a='I') OR (A='S' )) OR (A='5') then
s:='8';
if ((a='J') OR (A='T' )) OR (A='6') then
s:='9';
mm:=mm+s;
end;
Randomize;
p2:=copy (mm,3,1);
p3:=inttostr(Random(9));
p4:=copy (mm,length(mm),1);
p5:=INTTOSTR(Random(9));
p6:=copy (mm,4,1);
p7:=copy (mm,2,1);
PASSD:='MYNX'+P2+P3+P4+P5+P6+P7;
if ((p2=copy(reged.Text,6,1)) and (p4=copy(reged.Text,8,1)))
and ((p6=copy(reged.Text,10,1)) and (p7=copy(reged.Text,11,1)))
then
begin
MessageBox(handle,Pchar('注册成功,欢迎使用文章管理系统'),'注册成功',0+48);
dm1.tbreg.Edit;
dm1.tbreg['company']:=userco.Text;
dm1.tbreg['serno']:=label7.caption;
dm1.tbreg['regno']:=reged.Text;
dm1.tbreg['pcno']:=noed.Text;
dm1.tbreg.post;
dm1.tbreg.close;
fmlogin.Show;
nnn:=true;
fmreg.close;
end
else
begin
MessageBox(handle,Pchar('注册失败,系统将自动退出'),'注册失败',0+48);
fmmain.Close;

end;
end;

procedure Tfmreg.cabtClick(Sender: TObject);
begin
fmmain.Close;
end;

procedure Tfmreg.Button1Click(Sender: TObject);
begin
if trim(noed.text)='' then
begin
MessageBox(handle,Pchar('必须填写机号'),'注册信息',0+48);
end;

dm1.qrinfo_Open;
if dm1.qrinfo.RecordCount>100 then
begin
MessageBox(handle,Pchar('请注册本软件再使用'),'试用期已过',0+48);
fmmain.Close;
end;
dm1.qrinfo.close;
fmlogin.show;
nnn:=true;
dm1.tbreg.Open;
dm1.tbreg.Edit;
dm1.tbreg['company']:=userco.Text;
dm1.tbreg['serno']:=label7.caption;
dm1.tbreg['regno']:='none';
dm1.tbreg['pcno']:=noed.Text;
dm1.tbreg.post;
dm1.tbreg.close;
fmreg.close;
end;

procedure Tfmreg.usercoExit(Sender: TObject);
begin
IF TRIM(USERCO.Text)='' then
USERCO.SetFocus;
end;

procedure Tfmreg.noedExit(Sender: TObject);
begin
IF TRIM(NOED.Text)='' then
NOED.SetFocus;
end;

procedure Tfmreg.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
if nnn=false then
fmmain.Close;
end;

end.


 
完成同意"荷塘新月"的看法,这个时代偷技术比偷什么都方便!
他们不熟悉你的产品,就会给出一个往往偏高的抽象估价,而你则应该毫不犹豫地把这一
概念上财富转换成现实中的财富,晚点了,或是让他们看得多了,概念上的财富就越来越
少了,五年的心血啊!几乎是做技术人的青春,可以理解!
但做人吗,该出手时就出手!
况且,不破不立! 这个出手了,下个你一定会做得更好!
呵呵! 我就老是觉得自己以前写的软件是垃圾!
一次性出手!操作上要干净!
 
同意liwens,出手,而且要干净!
 
同意savenight的,要不然就自己干了。呵呵,一点建议而已。
 
同意liwens,我也觉得自己以前写的软件需要改进的地方太多了。
每写一个新的软件都用最贴近自己想法的方法来做,每次都有新
的收获。到哪天我对自己的软件满意了,我就是大侠了(不过,
好困难...)
 
自己干吧,大哥
 
世事变幻无常
拿到钱最要紧
 
尽快做决定,你说是行业软件,那就是说行业的规则非常的重要了,
如果让他们在暗地里请了相关的人员和程序员一起搞,拖的时间
长了,你的程序价值就越小了.
 
你先从旁观者的角度想一下,如果你是客户,你会出多少钱买这套软件?软件的市场价格与实际
售价偏差是很大的。比如某管理软件XX3000,在我们这可以用200元买到(肯定是正版),所以,不要
对可能的收益报太大的希望,从一个现实的角度出发,让你的对手觉得,价钱能够接受,同时
比自己开发来得方便就可以了。现实一些,不要太想自己的心血了。
 
有经商才能,自己作;无,卖给别人,干脆。
 
顶部