Prev: Pb install Ruby 1.9.1
Next: Limit Ring server to localhost only. RingFinger.new('localhost') apparently doesn't work
From: Aston on 2 Jul 2010 11:37 Hello, I have very little experience with dl. But I want to use it to call SetEnvironmentVariable() from Win32. I could use FFI but cannot, since this script will be supplied to a customer where it is difficult to install. SetEnvironmentVariable on MSDN http://msdn.microsoft.com/en-us/library/ms686206(v=VS.85).aspx reading sparse, old, and cryptic documentation I came up with this snippet, which of course does not work require 'dl/import' module Win32 extend DL::Importer extern "int SetEnvironmentVariableA( char* lpName, char* lpValue)" extern "int GetEnvironmentVariableA( char* lpName, char* lpValue, int size)" end buff = Array.new( 256, 0).pack("c*") Win32.GetEnvironmentVariableA( "ENV_VAR", buff, 255) puts buff.unpack("a*") this is the error i get D:/ruby/usr/lib/ruby/1.9.1/dl/import.rb:194:in `import_function': undefined method `sym' for nil:NilClass (NoMethodError) from D:/ruby/usr/lib/ruby/1.9.1/dl/import.rb:118:in `extern' from test.rb:5:in `<module:Win32>' from test.rb:3:in `<main>' machine is WinXP ruby 1.9.1 (2008-10-28 revision 19983) [i386-mswin32_80] can anybody suggest a better signature ? Aston
From: Gordon Thiesfeld on 2 Jul 2010 13:15 On Fri, Jul 2, 2010 at 10:37 AM, Aston <blackapache512-ticket(a)yahoo.com> wrote: > Hello, > > I have very little experience with dl. But I want to use it to > call SetEnvironmentVariable() from Win32. I could use FFI but cannot, since this > script will be supplied to a customer where it is difficult to install. > > SetEnvironmentVariable on > MSDN http://msdn.microsoft.com/en-us/library/ms686206(v=VS.85).aspx > > reading sparse, old, and cryptic documentation I came up with this snippet, > which of course does not work > > require 'dl/import' > > module Win32 > extend DL::Importer > extern "int SetEnvironmentVariableA( char* lpName, char* lpValue)" > extern "int GetEnvironmentVariableA( char* lpName, char* lpValue, int size)" > end > > buff = Array.new( 256, 0).pack("c*") > Win32.GetEnvironmentVariableA( "ENV_VAR", buff, 255) > puts buff.unpack("a*") > > this is the error i get > D:/ruby/usr/lib/ruby/1.9.1/dl/import.rb:194:in `import_function': undefined > method `sym' for nil:NilClass (NoMethodError) > from D:/ruby/usr/lib/ruby/1.9.1/dl/import.rb:118:in `extern' > from test.rb:5:in `<module:Win32>' > from test.rb:3:in `<main>' > > machine is WinXP > ruby 1.9.1 (2008-10-28 revision 19983) [i386-mswin32_80] > > can anybody suggest a better signature ? > > Aston > I can't help you with your issue, but I'm curious why it's necessary. The MSDN page you link to says SetEnvironmentVariable is only for the current process. Doesn't ENV do what you need? irb(main):001:0> ENV['FOO']='bar' => "bar" irb(main):002:0> `echo %FOO%` => "bar\n" irb(main):003:0>
From: Aston on 3 Jul 2010 11:20 ----- Original Message ---- > From: Aston <blackapache512-ticket(a)yahoo.com> > To: Ruby Talk <ruby-talk(a)ruby-lang.org>; Ruby Core <ruby-core(a)ruby-lang.org> > Sent: Fri, 2 July, 2010 9:07:00 PM > Subject: [ruby-core:30996] Ruby/DL problem > > Hello, > > I have very little experience with dl. But I want to use it to > call SetEnvironmentVariable() from Win32. I could use FFI but cannot, since >this > > script will be supplied to a customer where it is difficult to install. > > SetEnvironmentVariable on > MSDN http://msdn.microsoft.com/en-us/library/ms686206(v=VS.85).aspx > > reading sparse, old, and cryptic documentation I came up with this snippet, > which of course does not work > > require 'dl/import' > > module Win32 > extend DL::Importer > extern "int SetEnvironmentVariableA( char* lpName, char* lpValue)" > extern "int GetEnvironmentVariableA( char* lpName, char* lpValue, int size)" > end > > buff = Array.new( 256, 0).pack("c*") > Win32.GetEnvironmentVariableA( "ENV_VAR", buff, 255) > puts buff.unpack("a*") > > this is the error i get > D:/ruby/usr/lib/ruby/1.9.1/dl/importrb:194:in `import_function': undefined > method `sym' for nil:NilClass (NoMethodError) > from D:/ruby/usr/lib/ruby/1.9.1/dl/import.rb:118:in `extern' > from test.rb:5:in `<module:Win32>' > from test.rb:3:in `<main>' > > machine is WinXP > ruby 1.9.1 (2008-10-28 revision 19983) [i386-mswin32_80] > > can anybody suggest a better signature ? > > Aston > > hmm, nobody here using Ruby.DL ?
From: Luis Lavena on 3 Jul 2010 11:45
On Jul 3, 12:20 pm, Aston <blackapache512-tic...(a)yahoo.com> wrote: > ----- Original Message ---- > > From: Aston <blackapache512-tic...(a)yahoo.com> > > To: Ruby Talk <ruby-t...(a)ruby-lang.org>; Ruby Core <ruby-c...(a)ruby-lang..org> > > Sent: Fri, 2 July, 2010 9:07:00 PM > > Subject: [ruby-core:30996] Ruby/DL problem > > > Hello, > > > I have very little experience with dl. But I want to use it to > > call SetEnvironmentVariable() from Win32. I could use FFI but cannot, since > >this > > > script will be supplied to a customer where it is difficult to install. > > > SetEnvironmentVariable on > > MSDNhttp://msdn.microsoft.com/en-us/library/ms686206(v=VS.85).aspx > > > reading sparse, old, and cryptic documentation I came up with this snippet, > > which of course does not work > > > require 'dl/import' > > > module Win32 > > extend DL::Importer > > extern "int SetEnvironmentVariableA( char* lpName, char* lpValue)" > > extern "int GetEnvironmentVariableA( char* lpName, char* lpValue, int size)" > > end > > > buff = Array.new( 256, 0).pack("c*") > > Win32.GetEnvironmentVariableA( "ENV_VAR", buff, 255) > > puts buff.unpack("a*") > > > this is the error i get > > D:/ruby/usr/lib/ruby/1.9.1/dl/importrb:194:in `import_function': undefined > > method `sym' for nil:NilClass (NoMethodError) > > from D:/ruby/usr/lib/ruby/1.9.1/dl/import.rb:118:in `extern' > > from test.rb:5:in `<module:Win32>' > > from test.rb:3:in `<main>' > > > machine is WinXP > > ruby 1.9.1 (2008-10-28 revision 19983) [i386-mswin32_80] > > > can anybody suggest a better signature ? > > > Aston > > hmm, nobody here using Ruby.DL ? Is not DL the problem, but the version you're using. revision 19983 is *way* older than latest released one: Pathlevel 378 was revision 26273 Lurking in the NEWS and ChangeLog pointed several changes in DL. Trying your example with latest RubyInstaller 1.9.1 release: C:\Users\Luis\Desktop>ruby -v t.rb ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32] C:/Users/Luis/Tools/Ruby/ruby-1.9.1-p378-i386-mingw32/lib/ruby/1.9.1/ dl/import.rb:116: warning: instance variable @type_alias not initialized C:/Users/Luis/Tools/Ruby/ruby-1.9.1-p378-i386-mingw32/lib/ruby/1.9.1/ dl/import.rb:194: warning: instance variable @handler not initialized C:/Users/Luis/Tools/Ruby/ruby-1.9.1-p378-i386-mingw32/lib/ruby/1.9.1/ dl/import.rb:194:in `import_function': undefined method `sym' for nil:NilClass (NoMethodError) from C:/Users/Luis/Tools/Ruby/ruby-1.9.1-p378-i386-mingw32/lib/ ruby/1.9.1/dl/import.rb:118:in `extern' from t.rb:5:in `<module:Win32>' from t.rb:3:in `<main>' Which brings the question, why bother on doing this way when Ruby does it out of the box? -- Luis Lavena |