ShellExecute ile adres listesini gönderme sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
kelaynak2
Üye
Mesajlar: 135
Kayıt: 30 Haz 2003 02:18

ShellExecute ile adres listesini gönderme sorunu

Mesaj gönderen kelaynak2 »

Arkadaşlar merhaba
s:='veritabanından alınan E posta adresleri';
S := 'mailto:' +S;
ShellExecute(0, nil, PChar(S), nil, nil, SW_SHOWDEFAULT) ;

fonksiyonu ile S değişkenine aralarında ";" koyarak yaklaşık 30 E-posta adresini yazdığımda Outlok express sorunsuz açılıyor. Fakat 130 E-postayı birden yazdığımda Access Violation hatası veriyor. Bunun Çözümü var mı
İngilizce weblerde aradım cevabını bulamadım. Şimdiden teşekkürler.
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

S in boyutu kısa, değişkene fazla şey atıyorsun izinsiz alanı okumaya/yazmaya çalışıyor. stralloc ile alanı genişlet.
.-.-.-.-.-.-.-. ^_^
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var pcDegiskenin     : pChar;
 {$H+}S:string;{$H-}
 i:integer;
begin
S:='mailto:';
for i:= 1 to 150 do
 s:= s+ 'xxx@zz.com;';
showmessage(inttostr(Length(S)));

 pcDegiskenin:=StrAlloc(Length(S));
 StrPCopy(pcDegiskenin, S);

 ShellExecute(0, nil, pcDegiskenin, nil, nil, SW_SHOW) ;

 //Dispose etmelisin
 StrDispose(pcDegiskenin);
end;
burada {$H+}S:string;{$H-} ifadesinde H ile string ifadeyi ansistring olarak kullanıyorsunuz. böylece 255 yerine gbytelara kadar çıkıyor.

:arrow: daha fazla bilgi için bakınız delphi help :)
Type Switch
Syntax {$H+} or {$H-}
{$LONGSTRINGS ON} or {$LONGSTRINGS OFF}
Default {$H+}
{$LONGSTRINGS ON}
Scope Local
Remarks

The $H directive controls the meaning of the reserved word string when used alone in a type declaration. The generic type string
can represent either a long, dynamically-allocated string (the fundamental type AnsiString) or a short, statically allocated string (the fundamental type ShortString).
By default {$H+}, Delphi defines the generic string type to be the long AnsiString. All components in the component libraries are compiled in this state. If you write components, they should also use long strings, as should any code that receives data from component library string-type properties.

The {$H-} state is mostly useful for using code from versions of Delphi that used short strings by default. You can locally override the meaning of string-type definitions to ensure generation of short strings. You can also change declarations of short string types to string[255] or ShortString, which are unambiguous and independent of the $H setting.
AnsiString ~2^31 characters 4 bytes to 2GB 8-bit (ANSI) characters, DBCS ANSI, MBCS ANSI, etc.
.-.-.-.-.-.-.-. ^_^
Kullanıcı avatarı
kelaynak2
Üye
Mesajlar: 135
Kayıt: 30 Haz 2003 02:18

Gene Olmadı.

Mesaj gönderen kelaynak2 »

Mege bey,
Gönderdiğiniz kodu da denedim. gene olmadı.Gerçi bu sefer outlook express açıldı, ama arkadısından invalid pointer operation mesajını verd.İkinci defa denediğimde access voilation hatası.
sizin yazdığınız kodun en azından outlooku açma sebebibi sanırım yazdığınız e-posta adresinin çok kısa olması.Mesela xxxxxx.yyyyyy@basbakanlik.gov.tr gibi bir adres yazarsanız muhtemelen sizin kodunuz da hata verir.
Ben win 2000 pro ve 256 mb. Ramli, Delphi 6 ver. bilgisayar kullanıyorum.Belki Ram düşük geliyor.
Sizin yukarıda bildirdiğiniz kod yerine aşağıdaki kodu denedim yine olmadı.(hafızayı prosedür bitince kendisi atıyor.)

Kod: Tümünü seç

procedure TAnaForm.Button1Click(Sender: TObject);
var
s:string;
s1: array [0..10000] of char ;//10 bin bir baytlık yer ayır.
begin
s:='veritabanından alınan E posta adresleri'; 
S := 'mailto:' +S; 
fillchar(s1,100001,#0);//içini sıfırla.
strpcopy(s1,S);//stingi pchara kopyala.
ShellExecute(Handle, 'Open',S1 , nil, nil, SW_SHOW);

end;

Neticede SehellEXecute'nin 3. parametresi belli bir bayttan fazla veriyi kabul etmiyor diye düşünüyorum.

En son çözüm olarak e-postaları hafızaya kopyalayıp, outlook expresin konu kısmına adreslerin hafızada olduğunu uyaran bir yazıdan başka çare bulamdım:

Kod: Tümünü seç


Clipboard.SetTextBuf(pchar(S));//başka çare yok.

ShellExecute(Handle, 'Open','mailto:?Subject=Adresler hafızada,kime veya gizli bölümüne Yapıştırınız.' , nil, nil, SW_SHOWNORMAL);



Cevabınız için Teşekkürler.
En son kelaynak2 tarafından 22 Kas 2004 11:49 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

:oops: pardon demekki hata outlook dan :) sizin dediğiniz gibi mail adresini uzatınca program sizlere ömür sapıttı.

ama sorun parametreden değil. sonuçta gönderilen sadece 4bytelık bi pointer.

sorun alan tarafta. denemek için komut satırında

Kod: Tümünü seç

G:\Documents and Settings\mtn>start mailto:xxxxxxxxxxxxxxx@yyyyyyyyyyyyyyyyy.com
;xxxxxxxxxxxxxxx@yyyyyyyyyyyyyyyyy.com;xxxxxxxxxxxxxxx@yyyyyyyyyyyyyyyyy.com;xxx
xxxxxxxxxxxx@yyyyyyyyyyyyyyyyy.com;xxxxxxxxxxxxxxx@yyyyyyyyyyyyyyyyy.com;xxxxxxx
xxxxxxxx@yyyyyyyyyyyyyyyyy.com
ı deneyin açıyor. mail sayısını arttırdığınız zaman delphiden yaptığı gibi yapıyor.

peki sizin karşıdaki mail server bukadar kişiye aynı anda mail göndermeyi desteklicekmi? denedinizmi hiç? ben bayram mesajın atarken superonline(smtp) aynı anda 30 kişiden fazlasına birden mail atamadı, bu yüzden parça parça attım.

isterseniz baştan bir bunuda deneyin.
.-.-.-.-.-.-.-. ^_^
Kullanıcı avatarı
kelaynak2
Üye
Mesajlar: 135
Kayıt: 30 Haz 2003 02:18

Sorun ootlukta

Mesaj gönderen kelaynak2 »

Mege bey,
Mail sunucumuzda bir sorun yok, resmi bir kurum, yaklaşık 10 bin personelimiz var ve hepsinin bir e-posta hesabı var. 130 E-postayı kendi domainimizdekilere rahatlıkla gönderiyorum, fazlasını denemedim.
Yardımınız içint tekrar teşekkürler. :o
Cevapla